9장 - 자바를 배우면 패키지와 접근 제어자는 꼭 알아야 해요
- 패키지를 선언할 때 사용하는 예약어는 무엇인가?
- import
- 패키지 선언은 클래스 소스 중 어디에 위치해야 하는가?
- 맨 위
- 패키지를 선언할 때 가장 상위 패키지의 이름으로 절대 사용하면 안 되는 단어는 무엇인가?
- java
- 패키지 이름에 예약어가 포함되도 되는가?
- 안됨
- import는 클래스 내에 선언해도 되는가?
- 안됨
- 같은 패키지에 있는 클래스를 사용할 때 import를 해야하는가?
- 안해도 됨
- 특정 패키지에 있는 클래스들을 모두 import할 때 사용하는 기호는?
- *
- 클래스에 선언되어 있는 static한 메소드나 변수를 import하려면 어떻게 선언해야 하는가?
- import static 또는 SubStatic.CLASS_NAME
- 접근 제어자 중 가장 접근 권한이 넓은 (어떤 클래스에서도 접근할 수 있는) 것은 무엇인가?
- public
- 접근 제어자 중 가장 접근 권한이 넓은 (어떤 크르래스에서도 접근할 수 있는) 것은 무엇이가요?
- private
- 접근 제어자 중 가장 접근 권한이 좁은 (다른 클래스에서는 접근할 수 없는) 것은 무엇인가요?
- protected
- "Calculate.java"라는 소스가 있을 경우, 그 소스 내에서는 Calculate라는 클래스 외에는 ()으로 선언된 클래스가 있으면 안된다
- public
import 하지 않아도 되는 패키지
- java.lang (String, System 클래스)
- 같은 패키지
접근 제어자
- public - 누구나 접근 가능
- protected - 같은 패키지 내에 있거나, 상속받은 경우
- package-private - 같은 패키지 내에 있을 때만 접근 가능
- private - 해당 클래스 내에서만
* 접근 권한은 인스턴스 변수와 클래스 변수에도 동일하게 적용. 접근 제어자를 사용할 수 있는 곳은 클래스 선언문이다. 클래스를 선언할 때에는 반드시 파일 이름에 해당하는 클래스가 반드시 존재해야만 한다.
* public으로 선언된 클래스가 소스 내에 있다면, 그 소스 파일의 이름은 public 클래스 이름과 동일해야 하며, 두개 이상의 public 클래스는 동일한 클래스 파일에 존재할 수 없다.
10장 - 자바는 상속이라는 것이 있어요
- 상속을 받는 클래스의 선언문에 사용하는 키워드
- extends
- 상속을 받은 클래스의 생성자를 수행하면 부모의 생성자도 자동으로 수행되는가
- 그렇다
- 부모 클래스의 생성자를 자식 클래스에서 직접 선택하려고 할 때 사용하는 예약어는
- super
- 메소드 Overloading과 Overriding을 설명하라
- Overloading은 파라미터 형태가 다른 같은 역할을 하는 동일 메소드이고, Overriding은 부모로 부터 상속을 받은 자식에서 구현한 동일 시그니처를 가진 메소드를 의미한다.
- A가 부모, B가 자식 클래스라면 A a = new B();의 형태로 객체 생성이 가능한가
- 그렇다
- 명시적으로 형 변환을 하기 전에 타입을 확인하려면 어떤 예약어를 사용해야하는가
- instanceof
- 6에서 사용한 예약어의 좌측과 우측의 값은?
- 객체 / 클래스(타입)
- 6의 예약어 수행결과는 어떤 타입으로 제공되는가
- boolean
- Polymorphism이라는 것은 무엇인가
- 형변환을 하더라도, 실제 호출되는 것은 원래 객체에 있는 메소드가 호출되는 것
상속
- 자식 extends 부모
- 부모 클래스에 선언되어 있는 public, protected로 선언되어 있는 모든 변수와 메소드를 내가 갖고 있는 것처럼 사용 가능
- 자동으로 부모 클래스의 기본생성자가 호출되고, 다음 자식 클래스의 생성자에 있는 내용들이 호출
- 확장한 클래스는 추가적인 메소드를 만들어도 된다
- 자바에서는 다중 상속이 불가하다 = 단일 상속
생성자
- 부모 클래스에서는 기본 생성자를 만들어 놓는 것 외에 상속을 위해 아무런 작업할 필요가 없음
- 부모 클래스에 매개변수를 받는 메소드가 있을 경우, 기본생성자가 없다면 컴파일 에러가 발생. 이유는 클래스 상속을 받은 자식 클래스의 모든 생성자가 실행될 때, 부모 클래스의 기본생성자를 찾는데, 부모 클래스에 정의한 생성자는 매개변수로 받는 생성자 밖에 없기 때문인데, 이를 해결하기 위한 하위의 두가지 방법이 있다
- 부모 클래스에 "매개 변수가 없는" 기본생성자 생성
- 자식 클래스에서 부모 클래스의 생성자를 명시적으로 지정하는 super()를 사용
- 메소드처럼 super()로 사용하면 부모 클래스의 생성자를 호출함을 의미
- 메소드처럼 사용하지 않고, super.printName()로 사용하면 부모 클래스의 printName()라는 메소드르 호출한다는 의미
- super()를 사용하여 생성자를 호출 시, 모호하게 null을 넘기는 것보다 호출하고자하는 생성자의 기본 타입을 넘김을 권장
- 자식 클래스의 생성자에서 super()를 명시적으로 지정하지 않으면, 컴파일시 자동으로 super()가 추가되며, 부모 클래스의 생성자를 호출하는 super()는 반드시 자식 클래스의 생성자에서 가장 첫줄에 선언되어야 한다
메소드 Overriding
- 자식 클래스에서 부모 클래스에 있는 메소드와 동일하게 선언하는 것 (동일한 시그니처 - 접근제어자, 리턴타입, 메소드 이름, 매개변수 타입 및 개수)
- 생성자의 경우 자동으로 부모 클래스에 있는 생성자를 호출하는 super()가 추가되지만, 메소드는 그렇지 않다
- 한 접근 제어자가 더 확대되는 것은 가능하지만 축소는 불가능 (부모클래스에서 public선언한 것을 자식이 private x)
- Overriding된 메소드는 부모 클래스와 동일한 리턴타입을 가져야한다
- Overloading : 확장(메소드의 매개 변수들을 확장) / Overriding : 덮어씀
참조 자료형의 형 변환
ParentCasting parent = new ParentCasting();
ChildCasting child = new ChildCasting();
ParentCasting obj = new ChildCasting();
- 상속 관계가 성립되면 두번째와 같이 객체를 생성할수 있지만, 반대로 ChildCasting obj2 = new ParentCasting()은 불가
- 자식 객체를 생성할 때 부모 생성자를 사용불가
- 자식 타입의 객체를 부모 타입으로 형변환 하는 것은 자동으로 된다
- 부모 타입의 객체를 자식 타입으로 형변환을 할 때에는 명시적으로 타입을 지정해줘야한다
Instanceof
- 객체 타입을 확인
- 객체 타입을 확인시, 부모 타입도 true라는 결과를 제공
12장 - 모든 클래스의 부모 클래스는 Object에요
- 모든 클래스의 최상위 부모 클래스인 Object클래스는 어떤 패키지에 선언되어 있나요
- java.lang
- 클래스가 어떻게 선언되어 있는지 확인할 수 있는 명령어(실행 파일)의 이름은 무엇인가요
- getClass().getName()
- Object 클래스에 선언되어 있는 모든 메소드는 Overriding해야하는가?
- x
- Object 클래스의 clone()의 용도는 무엇인가
- 객체 복사
- System.out.println() 메소드를 사용하여 클래스를 출력했을 때 호출되는 Object 클래스에 있는 메소드는 무엇인가
- toString()
- 객체의 주소를 비교하는 것이 아닌, 값을 비교하려면 Object 클래스에 선언되어 있는 어떤 메소드를 overriding해야하는가
- equals()
- Object 클래스에 선언되어 있는 hashcode()라는 메소드는 어떤 타입의 값을 리턴하는가
- int
Object 클래스
- Object클래스에 선언되어 있는 메소드는 객체를 처리하기 위한 메소드와 쓰레드를 위한 메소드로 구분
객체를 처리하기 위한 메소드 | 설명 |
protected Object clone() | 객체의 복사본을 만들어 리턴 |
public boolean equals(Object obj) | 현재 객체와 매개 변수로 넘겨받은 객체가 같은지 확인한다. 같으면 true, 다르면 false |
protected void finalize() | 현재 객체가 더 이상 쓸모가 없어졌을 때, 가비지 컬렉터에 의해 이 메소드가 호출된다. |
public Class<?> getClass() | 현재 객체의 Class 클래스의 객체를 리턴 |
public int hashCode() | 객체에 대한 해시코드 값을 리턴. 해시 코드란, 16진수로 제공되는 객체의 메모리 주소 |
public String toString() | 객체를 문자열로 표현하는 값을 리턴 |
쓰레드를 처리하기 위한 메소드 | 설명 |
public void notify | 이 객체의 모니터에 대기하고 있는 단일 쓰레드를 깨운다 |
public void notifyAll() | 이 객체의 모니터에 대기하고 있는 모든 쓰레드를 깨운다 |
public void wait() | 다른 쓰레드가 현재 객체에 대한 notify() 메소드나 notifyAll() 메소드를 호출할 땎지 현재쓰레드가 대기하고 있도록 함 |
public void wait(long timeout) | wait() 메소드와 동일한 기능을 제공하며, 매개 변수에 지정한 시간만큼 대기 |
public void wait(long timeout, int nanos) | wait() 메소드와 동일한 기능을 제공하지만 wait(timeout)보다 자세한 밀리초+나노초 만큼 대기 |
toString()
- System.out.println()메소드에 매개 변수로 들어가는 경우
- 객체에 대하여 더하기 연산을 하는 경우
- 클래스에 선언된 값을 확인할 때 사용
equals()
- == 와 != 는 기본자료형만 비교가 가능
- 참조 자료형에서 ==,!= 를 사용한다는 것은 값이 아닌, 주소값을 비교함을 의미
- 참조 자료형을 비교
- 그러나, overriding을 하지 않는다면 hashcode()값을 비교
객체의 고유값을 나타내는 hashcode()
- 객체의 메모리 주소를 16진수로 리턴
- int 값을 리턴
- equals() 메소드를 사용하여 비교한 결과가 true일 경우, 두 객체의 hashcode() 메소드를 호출하면 동일한 int값을 리턴해야한다
'JAVA > about java' 카테고리의 다른 글
[Interface, abstract, enum] 인터페이스, 추상클래스, enum / 예외처리 (0) | 2023.04.19 |
---|---|
[JVM] JVM 메모리모델 (0) | 2023.04.18 |
[Muatable and Immutable] 가변 객체와 불변 객체 (0) | 2023.04.17 |
[Class, Data Type, Array] 클래스 / 객체 / 변수 / 기본 자료형 / 조건문 / 배열 / 참조 자료형 (0) | 2023.04.11 |
[Map] getOrDefault (0) | 2022.09.26 |