1.
System.out.println("Hello " + new StringBuilder("Java SE 8"));
Java에서 문자열과 객체를 + 연산으로 연결할 경우, 객체의 toString() 메서드가 호출
따라서 출력은 **Hello Java SE 8**
System.out.println("Hello " + new MyString("Java SE 8").msg);
MyString 객체에서 .msg 필드를 명시적으로 접근했기 때문에 toString() 호출 없이 필드 값 자체가 출력
2.
class Bird {
public void fly() {
System.out.print("Fly.");
}
}
class Peacock extends Bird {
public void dance() {
System.out.print("Dance.");
}
}
public class Test {
public static void main(String[] args) {
Bird b = new Peacock (); Peacock p = (Peacock) b;
p.fly();
p.dance();
}
}
D. Bird b = new Peacock(); Peacock p = (Peacock) b;
- b는 Bird 타입의 참조 변수로, 실제 객체는 Peacock
- b를 Peacock 타입으로 강제 형변환하여 p에 할당
- 여기서 p.fly()와 p.dance() 모두 호출이 가능
참조 변수의 타입은 호출 가능한 메서드를 결정
실제 객체의 타입은 호출된 메서드의 구현체를 결정
3.
- 체크드 예외(Checked Exception)
- 컴파일러가 반드시 throws 선언 또는 try-catch로 처리해야 하는 예외
- Exception 클래스에서 파생된 예외 중, RuntimeException을 상속하지 않는 예외들이 해당
- 예: IOException, SQLException, LogFileException
- 언체크드 예외(Unchecked Exception)
- 컴파일러가 throws 선언을 요구하지 않는 예외.
- RuntimeException을 상속하는 예외들이 이에 해당
- 예: NullPointerException, ArrayIndexOutOfBoundsException, AccessViolationException
4.
배열의 크기를 명시하지 않고 바로 값을 제공
int array[] = {1, 2, 3};
new 키워드를 사용하고 값만 제공 (크기를 생략)
int array[] = new int[] {1, 2, 3};
int array[] = new int[3]; array[0] = 1; array[1] = 2; array[2] = 3;
array = new int[] {1, 2, 3};
5.
class CC1 {
}
class CC2 extends CC1 {
}
public class CC3 extends CC2 {
public static void main(String[] args) {
CC1 obj1 = (CC1) new CC2();
CC2 obj2 = (CC2) new CC3();
CC2 obj3 = (CC2) new CC1(); // ClassCastException
CC3 obj4 = (CC3) obj2;
}
}
- Line 18: C2 obj3 = (C2) new C1();
- ClassCastException 발생
C1은 C2의 상위 클래스이며, **하위 타입인 C2로 다운캐스팅하려고 하면 런타임 에러(ClassCastException)**가 발생
- ClassCastException 발생
- Line 19: C3 obj4 = (C3) obj2;
- 유효함
obj2는 C2 타입이지만 실제로 new C3()로 생성
따라서 실제 객체 타입이 C3인 경우 하위 타입으로의 다운캐스팅이 가능
- 유효함
6.
public static void main (String[] args) {
List<String> arrayList = new ArrayList<>();
arrayList.add("Tech");
arrayList.add("Expert");
arrayList.set(0, "Java");
arrayList.forEach(a -> a.concat("Forum"));
arrayList.replaceAll(s -> s.concat("Group"));
System.out.println(arrayList);
}
- forEach는 리스트의 요소를 변경하지 XX
- replaceAll은 리스트의 요소를 변경
7.
interface Playable {
public void play();
public void setPlayers(List<Player> players);
}
class Game implements Playable {
private List<Player> players;
public List<Player> getPlayers() {
return players;
}
public void setPlayers(List<Player> players) {
this.players = players;
}
public void play() {
System.out.println("Played.");
}
}
public class Test {
public static void main(String[] args) {
Playable p = new Game();
List<Player> players = new ArrayList<>();
p.setPlayers(players);
p.play();
}
}
- 다형성 (Polymorphism):
- Playable p = new Game();
이 구문은 Playable 타입 변수 p가 Game 객체를 참조하는 다형성
- Playable p = new Game();
- 추상화 (Abstraction):
- Playable 인터페이스는 추상화
추상화란 구현을 숨기고, 사용자가 반드시 필요한 동작(계약)만 보게 하는 것
여기서 Playable 인터페이스는 play()와 setPlayers()라는 동작만 정의하고, 세부 구현은 Game 클래스에서 처리
- Playable 인터페이스는 추상화
- 캡슐화 (Encapsulation):
- private List<Player> players는 외부에서 직접 접근하지 못하도록 숨겨져 있음
- 대신, getPlayers()와 setPlayers() 메서드를 통해서만 players 필드에 접근
이게 캡슐화의 핵심입니다: 데이터를 숨기고, 안전한 접근 방법을 제공
- 상속 (Inheritance):
- 여기서 상속의 정의가 **인터페이스 구현(implements)**도 포함
- Game 클래스는 Playable 인터페이스를 구현하고 있으므로, 넓은 의미에서 상속을 포함
8.
class Product {
int id;
String name;
Product(int id, String name) {
this.id = id;
this.name = name;
}
}
public class Shop {
public static void main(String[] args) {
List<Product> lst = new ArrayList<>();
lst.add(new Product(10, "IceCream"));
lst.add(new Product(11, "Chocolate"));
Product p1 = new Product(10, "IceCream");
System.out.println(lst.indexOf(p1));
}
}
indexOf안에 equals() 메서드 내장. 하지만 여기서는 오버라이딩 되어 있지 않기 때문에
객체 자체를 비교 > 따라서 반환되는 값이 없기 때문에 -1 반환
왜 여태까지는 당연히 equals()를 내용비교라고 생각했지?
>>예: String 클래스
String 클래스는 이미 equals()가 오버라이드되어 있음. String 객체는 기본적으로 내용(값)을 기준으로 비교
Java의 Wrapper 클래스(Integer, Double, etc.)도 마찬가지로 equals()를 오버라이드
'Certification > OCAJP' 카테고리의 다른 글
OCAJP 준비 (Q219 - Q236) (1) | 2024.11.28 |
---|---|
OCAJP 준비 (Q201 - Q218) (2) | 2024.11.27 |
OCAJP 준비 (Q166 - Q176) (0) | 2024.11.25 |
OCAJP 준비 (Q146 - Q165) (0) | 2024.11.21 |
OCAJP 준비 (Q126 - Q145) (1) | 2024.11.18 |