📝 TIL

[TIL] Java 빌트인 패키지, 접근제어자, 상속, 오버라이딩, 다형성, 추상 클래스

오늘 ONEUL 2022. 5. 19. 21:32

✍ Today I Learned

[java.time]

  • 1.8 이전에는 new Date()로 구현했으나, 1.8 이후에는 calendar 혹은 LocalDate, LocalDateTime을 사용을 권장한다.
  • immutable이기 때문에 한 번 생성되면 연산에도 변하지 않고 now는 끝까지 처음 시간을 유지한다.
  • java.time 패키지의 클래스들은 여러 직관적인 이름의 메서드를 제공해준다.
  • LocalDate - 날짜(ex. 발송일로부터 며칠)
  • LocalTime - 시간
  • LocalDateTime - 날짜&시간(ex. 게시글 업로드 시간)
  • DateTimeFormatter - 원하는 형식으로 지정 가능
LocalDate today = LocalDate.now();

System.out.println(today); // 2022-05-19
System.out.println(today.getDayOfMonth()); // 19
System.out.println(today.getDayOfWeek()); // THURSDAY
System.out.println(today.getDayOfYear()); // 139
System.out.println(today.getMonthValue()); // 5
System.out.println(today.getYear()); // 2022
System.out.println(today.getMonth()); // MAY
System.out.println(today.plusYears(1L)); // 2023-05-19
LocalDate ago100 = today.minusYears(100L);
System.out.println(ago100); // 1922-05-19
  • yyyy-MM-dd HH:mm:ss 형태로 출력하기 위한 다양한 방법
LocalDateTime todayNow = LocalDateTime.now();
String curr = todayNow.toString();

// split
String day = curr.split("T")[0];
String time = curr.split("T")[1].substring(0, 8);
System.out.println(day + " " + time); // 2022-05-19 16:21:05

// substring
String day2 = curr.substring(0, curr.indexOf("T"));
String time2 = curr.substring(curr.indexOf("T")+1, curr.lastIndexOf("."));
System.out.println(day2 + " " + time2); // 2022-05-19 16:21:05

// replace
System.out.println(curr.substring(0, curr.lastIndexOf(".")).replace("T", " ")); // 2022-05-19 16:21:05

// DateTimeFormatter
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
System.out.println(dtf.format(todayNow)); // 2022-05-19 16:21:05
System.out.println(todayNow.format(dtf)); // 2022-05-19 16:21:05

 

[java.math]

  • java.lang 소속의 math클래스를 좀 더 보완하기 위해 만들어진 패키지이다.
  • 자바는 수를 저장할 때 내부적으로 이진수의 근사치를 저장하기 때문에 소수점의 정밀도가 완벽하지 않아 값의 오차가 생길 수 있는데 이때 사용하는 것이 BigDecimal 클래스이다.
  • 문자열로 초기화하기 때문에 사칙연산은 할 수 없고, BigDecimal 클래스 내부에 있는 메서드를 사용해야 한다.
BigDecimal bdc = new BigDecimal("123.456"); // 문자열로 초기화
  • int와 long의 범위를 벗어난 큰 수를 관리할 때는 BigInteger 클래스를 사용한다.
BigInteger bit = new BigInteger("10000"); // 마찬가지로 문자열 초기화

 

[java.util.random]

  • java.math 클래스의 random() 메서드 외에 랜덤 숫자를 만들 수 있는 클래스이다.
Random r= new Random();
int rInt = r.nextInt(100)+1; // 1 ~ 100 사이의 난수 발생

 

[java.util.regex]

  • 정규식 문법 자체는 자바스크립트와 많이 다르지 않다.
  • 패턴을 만들기 위해 Pattern 메서드를, 비교하기 위해 Matcher 클래스를 사용한다.
  • 웹 분야에서는 주로 아이디나 비밀번호를 포함한 고객 정보 판별이나, 파일 확장자명 판별에 사용한다.
String[] strArr = {"bat", "baby", "bounus", "cA", "ca", "co", "c", "c0", "car", "combat", "count", "date", "disc"};

// 소문자c로 시작하고 모두 소문자인 패턴
Pattern pattern = Pattern.compile("c[a-z]*");
for (String str : strArr) {
    Matcher matcher = pattern.matcher(str);
    if (matcher.matches()) {
        System.out.print(str + ", "); // ca, co, c, car, combat, count, 
    }
}

 

[java.util.StringTokenizser]

  • 문자열에서 특수기호를 분리할 때 자주 사용된다.
String str = "100,200,300,400";
StringTokenizer st = new StringTokenizer(str, ",");

while (st.hasMoreTokens()) {
    System.out.print(st.nextToken() + " "); // 100 200 300 400
}

String exp = "x=100*(100+10)/3";
StringTokenizer st2 = new StringTokenizer(exp, "x=*-+/()", false);

while (st2.hasMoreTokens()) {
    System.out.print(st2.nextToken() + " ");// 100 100 10 3
}

 

[제어자 Modifier]

  • 제어자(modifier)란? 클래스와 클래스 멤버의 선언 시 사용하여 부가적인 의미를 부여하는 키워드를 의미한다.
  • 접근 제어자(access modifier)를 사용하여 정보 은닉을 구체화할 수 있다.
  • public, private, default는 범위 접근 제한 / protected는 지정 접근 제한
  • public - 모든 외부 클래스에게 오픈
  • private - 동일한 클래스의 내부 멤버 변수, 멤버 메서드, 내부 클래스에게만 오픈
  • 생략된(default) - 같은 패키지에 소속된 클래스에게만 오픈
  • protected - extends(상속), implements(구현)가 적용된 클래스에게만 오픈
  • 기타 제어자로는 final, static, abstract가 있다.
  • final - '변경할 수 없다'는 의미이다. 클래스에 사용하면 해당 클래스는 다른 클래스가 상속받을 수 없고, 메서드에 사용하면 해당 메서드는 오버 라이딩(overriding) 할 수 없고, 필드나 지역변수에 사용하면 값을 변경할 수 없는 상수(constant)가 된다.
  • static - '공통적인'이라는 의미이다. 메서드에 사용하면 해당 메서드를 클래스 메서드로 만들어주고, 변수에 사용하면 해당 변수를 클래스 변수로 만들어준다. 초기화 블록에도 사용 가능하다. 인스턴스를 생성하지 않고도 바로 사용할 수 있으며 해당 클래스의 모든 인스턴스가 공유한다.
  • abstract - '추상적인'이라는 의미이다. 추상 클래스, 추상 메서드에는 반드시 abstract 제어자를 붙여야 한다.

 

[상속 Inheritance]

  • 상속(inheritance)이란? 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다. extends 키워드를 사용하고, 이때 기존의 클래스를 부모 클래스(parent class) 상속을 통해 작성되는 클래스를 자식 클래스(child class)라고 한다.
  • 상속의 장점으로는 기존 클래스의 재활용, 중복 제거, 다형성의 문법적 토대 마련 등이 있다.
  • 자식 클래스에는 부모 클래스의 필드와 메서드만 상속되고, 생성자와 초기화 블록은 상속되지 않는다.
  • 부모 클래스에서 접근 제어가 private나 default로 설정된 멤버는 자식 클래스에서 접근할 수 없다.
  • 자바에서는 단 한 개의 클래스만을 상속받는 단일 상속만 가능하다.
  • 상위 개념에서 > 하위 개념 has a 관계 / 하위 개념에서 > 상위 개념 is a 관계 (ex. 냉장고 > 김치 냉장고, 양문형 냉장고)
  • 상속 개념을 사용하기 위해서는 속성과 기능을 명료하게 정하는 추상화 작업을 탄탄히 하여 관계 설정을 확실하게 해야 한다. 한번 쓰고 말 거면 안 만드는 게 낫다.
  • 부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같을 경우 super 키워드를 사용하여 구분한다.
  • super() 메서드는 부모 클래스의 생성자를 호출할 때 사용한다. (생성자 첫 줄에 사용)

 

[메서드 오버 라이딩 Method overriding]

  • 오버 라이딩(overriding)이란? 상속 관계에 있는 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 같은 시그니쳐를 갖는 메서드로 다시 정의하는 것이다. (오버 로딩은 서로 다른 시그니쳐를 갖는 여러 메서드를 하나의 이름으로 정의하는 것)
  • 메서드의 동작만을 재정의하는 것이므로, 메서드의 선언부는 기존 메서드와 완전히 같아야 한다.
  • 부모 클래스의 메서드보다 더 좁은 범위의 접근 제어자로 변경할 수 없고, 더 큰 범위의 예외를 선언할 수 없다.

 

[다형성 Polymorphism]

  • 다형성(polymorphism)이란? 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.
  • 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있다. 이때 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 같거나 적어야 참조할 수 있다.
class Parent { ... }
class Child extends Parent { ... }

...

Parent pa = new Parent(); // 허용
Child ch = new Child();   // 허용
Parent pc = new Child();  // 허용
Child cp = new Parent();  // 오류 발생
  • 상속 관계에 있는 클래스 사이의 참조 변수는 서로 타입 변환을 할 수 있다.
    자식 클래스 타입 > 부모 클래스 타입(변환 생략 가능) / 부모 클래스 타입 > 자식 클래스 타입(변환 반드시 명시)
  • instanceof - 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 확인하는 연산자이다. true or false를 반환한다.

 

[추상 메서드 Abstract Method]

  • 추상 메서드(abstract method)란? 자식 클래스에서 반드시 오버 라이딩해야만 사용할 수 있는 메서드를 의미한다.
  • 왜 추상 메서드를 사용할까? 추상 메서드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메서드를 구현하도록 하기 위해서이다.
  • 추상 메서드는 선언 부만 존재하며, 구현부는 작성되어 있지 않다. 선언부 끝에 세미콜론(;)을 작성한다.

 

[추상 클래스 Abstract Class]

  • 추상 클래스(abstract class)란? 하나 이상의 추상 메서드를 포함하는 클래스를 의미한다.
  • 반드시 사용되어야 하는 메서드를 추상 클래스의 추상 메서드로 선언해 놓으면, 상속받는 모든 클래스에서 이 추상 메서드를 반드시 재정의 해야 한다.
  • 추상 클래스는 인스턴스를 생성할 수 없다.