본문 바로가기

TIL(Today I Learned)

TIL-230920(자바의정석 Chapter07 '객체지향 프로그래밍2')

📝오늘 공부한 것

  • 자바의 정석 공부 - Chapter 07 끝까지
  • 자바의 정석 스터디

 

📌 자바의 정석 스터디

[ 상속 ]

  • 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
  • 지손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.

  - 접근 제어자가 private또는 default인 멤버들은 상속되지 않는다기보다 상속은 받지만 자손 클래스로부터 접근이 제한되는 것

 

클래스 간의 관계

클래스로 문장을 만들었을 때

‘ ~은 ~이다’ → 상속관계

‘~은 ~을 가지고 있다’ → 포함관계

 

단일 상속

자바에서는 다중상속X, 단일상속만 허용

다중상속의 경우 클래스간의 관계가 매우 복잡해지고, 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다

⇒ 즉, 클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 만들어 준다.

 

[ 오버라이딩 ]

조건 : 선언부가 일치해야 함(이름, 매개변수, 반환타입이 같아야함)
단, 접근제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다.

  1. 접근제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.
  2. 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
    → 예외의 갯수가 아닌 범위!
  3. 인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
오버라이딩을 할때 접근제어자에 대해서는 생각을 하고 사용했지만, 예외는 크게 신경썼던 적은 없는 것 같다. 앞으로 사용할 때 주의하자!

 

오버로딩 vs 오버라이딩

오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것(new)

오버라이딩 : 상속받은 메서드의 내용을 변경하는 것(change, modify)

 

super() - 조상 클래스의 생성자

Object클래스를 제외한 모든 클래스의 생성자는 첫 줄에 반드시 생성자, this() 또는 super(),를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 super();를 추가한다.

 

[ package와 import ]

패키지

 - 클래스 파일들을 압축한 것이 jar파일(*.jar)

 - 패키지명은 대소문자를 모두 허용하지만, 클래스명과 쉽게 구분하기 위해서 소문자로 하는 것을 원칙으로 한다.

 - 클래스패스(classpath)는 컴파일러나 JVM 등이 클래스의 위치를 찾는데 사용되는 경로이다.

 

import문

모든 소스파일에는 묵시적으로 import java.lang.*;이 선언되어 있음.

→ java.lang패키지는 매우 빈번히 사용되는 중요한 클래스들이 속한 패키지이기 때문에 따로 import문으로 지정하지 않아도 되도록 함.

 

[ 제어자 ]

객체지향개념의 캡슐화

데이터가 유효한 값을 유지하도록, 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해서는 외부로부터 접근을 제한하는 것이 필요하다.

외부에서 접근할 필요가 없는 멤버들을 private으로 지정하여 외부에 노출시키지 않음으로써 복잡성을 줄일수 있다.

 

 <꼭 외우기!!>
하나의 소스파일(*.java)에는 public클래스가 단 하나만 존재할 수 있으며, 소스파일의 이름은 반드시 public 클래스의 이름과 같아야함

 

제어자

대상 사용가능한 제어자
클래스 public, (default), final, abstract
메서드 모든 접근 제어자, final, abstract, static
멤버변수 모든 접근 제어자, final, static
지역변수 final
  1. 메서드에 static과 abstract를 함께 사용할 수 없다.
    static메서드는 몸통이 있는 메서드에만 사용할 수 있기 때문
  2. 클래스에 abstract와 final을 동시에 사용할 수 없다.
     - 클래스에서 사용되는 final은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문
  3. abstract메서드의 접근제어자가 private일 수 없다.
     - abstract메서드는 자손클래스에서 구현해주어야 하는데 접근제어자가 private이면, 자손클래스에서 접근할 수 없기 때문
  4. 메서드에 private과 final을 같이 사용할 필요는 없다.
     - 접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문. 이 둘 중 하나만 사용해도 의미가 충분함.

 

[ 다형성 ]

참조변수의 형변환

서로 상속관계에 있는 타입간의 형변환은 양방향으로 자유롭게 수행 가능.

그러나, 참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않음.

그래서, 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는 것이 중요함!

→ instanceof연산자 사용

 

instanceof

  • ‘참조변수’ instanceof ‘타입(클래스명)’
  • 연산의 결과로 true/false 반환
  • 형변환이 가능하면 true

Vector클래스

  • 동적으로 크기가 관리되는 배열
  • 내부적으로 Object타입의 배열을 가지고 있어서, 이 배열에 객체를 추가하거나 제거할 수 있게 작성되어 있다.
  • 배열의 크기를 알아서 관리해주기 때문에 저장할 인스턴스의 개수에 신경쓰지 않아도 된다.

 

느낀 점🤔

스터디를 하다보면 내가 중요하지 않다고 생각하여 대충 넘어갔던 부분들을 다시 한번 살펴보며 놓쳤던 것들을 배울 수 있었다. 또, 다른 사람에게 설명을 하기 위해 더 자세히 공부하고는 것도 있는 것 같다. 같은 주제에 대해서 함께 이야기하면서 한번더 기억할 수 있어 좋은 것 같다.

 

개선할 점💪🏻

당연하게 읽고 넘어가지 말고, 왜 그럴까?에 대해서 한번 씩 생각하는 연습을 해야할 것 같다!