1.
class A {
public A() {
System.out.print("A "); // 1. 최상위 부모 생성자
}
}
class B extends A {
public B() {
super(); // 자동 호출
System.out.print("B "); // 2. 부모 생성자
}
}
class C extends B {
public C() {
super(); // 자동 호출
System.out.print("C "); // 3. 자식 생성자 컴파일러가 자동으로 super(); 를 삽입
}
}
A -> B -> C
2.
class X {
static int i; // 클래스 변수 (모든 객체가 공유)
int j; // 인스턴스 변수 (각 객체마다 별도)
public static void main(String[] args) {
X x1 = new X();
X x2 = new X();
x1.i = 3; // static i를 3으로 변경
x1.j = 4; // x1의 j를 4로 변경
x2.i = 5; // static i를 5로 변경 (x1.i도 5가 됨)
x2.j = 6; // x2의 j를 6으로 변경
System.out.println(
x1.i + " " + // 5 (마지막으로 변경된 static i 값)
x1.j + " " + // 4 (x1의 j 값)
x2.i + " " + // 5 (동일한 static i 값)
x2.j); // 6 (x2의 j 값)
}
}
3.
Improves the program structure because the error handling code is separated from the normal program function ✅
Provides a set of standard exceptions that covers all possible errors ❌ > 모든 에러를 커버하지는 않음
Improves the program structure because the programmer can choose where to handle exceptions ✅
> throws를 사용해 예외를 상위 메소드로 전달 가능 / 가장 적절한 위치에서 예외 처리 가능
Improves the program structure because exceptions must be handled in the method in which they occurred ❌
> 예외는 발생한 곳에서 처리할 필요 없음 / Throws로 다른 곳에서 처리 가능
Allows the creation of new exceptions that are customized to the particular program being created
4.
// Greeting.java 파일
public class Greeting {
public static void main(String[] args) {
System.out.println("Hello " + args[0]);
}
}
Hello Duke
5.
// 현재 시스템 날짜 (2014-06-20)를 가져옴
LocalDate date1 = LocalDate.now();
// 2014년 6월 20일 날짜를 생성
LocalDate date2 = LocalDate.of(6, 20, 2014);
// 문자열을 날짜로 파싱, ISO_DATE 형식 사용
LocalDate date3 = LocalDate.parse("2014-06-20", DateTimeFormatter.ISO_DATE);
>>>>>>>>
LocalDate date2 = LocalDate.of(2014, 6, 20); // 올바른 날짜 순서로 수정
컴파일 오류 (Compilation Error)
- 정의: 컴파일 오류는 코드를 작성하는 시점에서 문법이나 타입 등의 문제로 인해 코드가 실행되기 전에 발생하는 오류
- 발생 시점: 코드를 컴파일할 때, 즉 코드가 바이트코드로 변환될 때 발생
- 결과: 컴파일 오류가 발생하면 프로그램 자체가 아예 실행되지 XXXX
런타임 예외 (Runtime Exception)
- 정의: 런타임 예외는 프로그램이 실행 중일 때 발생하는 오류.
코드 자체는 컴파일러가 통과시켜 실행을 시도할 수 있지만, 실행 도중에 특정 조건이나 데이터 때문에
예외 상황이 발생 - 발생 시점: 프로그램이 실제로 실행될 때, 특정 코드가 실행되면서 문제를 일으킬 때 발생
- 예시: LocalDate.of(6, 20, 2014);는 매개변수의 타입과 순서가 올바른 것처럼 보이기 때문에 컴파일러는 통과.
그러나 실행 도중에 6을 연도로 해석하려고 하다가 20과 2014를 날짜와 월로 매핑하려고 시도하면서
유효하지 않은 날짜라는 이유로 DateTimeException이라는 런타임 예외가 발생
6.
discount = (qty >= 90) ? 0.5 : (qty > 80) ? 0.2 : 0 ✅
- qty >= 90이면 discount = 0.5.
- qty가 80보다 크고 90보다 작으면 discount = 0.2.
- 그렇지 않으면 discount = 0.
- 조건을 정확히 만족
discount = (qty > 80) ? 0.2 : (qty >= 90) ? 0.5 : 0 ❌
- qty > 80이면 discount = 0.2.
- 그렇지 않고 qty >= 90이면 discount = 0.5.
- 그렇지 않으면 discount = 0.
- 문제: qty >= 90인 경우에도 qty > 80 조건이 먼저 참으로 평가되기 때문에, discount가 0.2로 설정됩니다.
=> 조건을 만족하지 않음
7.
- A. Objects can be reused. ✅
- B. A subclass must override the methods from a superclass. ❌
- C. Objects can share behaviors with other objects. ✅
- D. A package must contain a main class. ❌
- E. Object is the root class of all other objects. ✅
- F. A main method must be declared in every class. ❌
8.
StringBuilder sb = new StringBuilder(creditCard);
sb.substring(15, 19);
return x + sb;
>>>>> sb subbstring 내역이 따로 저장되지 않음
return x + creditCard.substring(15, 19);
>>>>> 바로 입력은 괜찮
StringBuilder sb = new StringBuilder(creditCard);
StringBuilder s = sb.insert(0, x);
return s.toString();
>>>>> StringBuilder s = sb.insert(0, x); 는 sb 0번째에 x를 삽입한다는 뜻임
한마디로 x에다가 creditCard가 다 들어간다는 뜻
StringBuilder sb = new StringBuilder("World");
StringBuilder s = sb.insert(0, "Hello ");
System.out.println(s); // 출력: Hello World
System.out.println(sb == s); // 출력: true (둘은 동일한 객체를 가리킴)
**sb.insert(0, "Hello ")**는 sb 객체의 참조를 반환.
따라서 반환값을 새로운 변수 **s**에 할당해도 **sb**와 **s**는 같은 객체를 참조
9.
- public
- 어디서나 접근 가능 같은 클래스, 같은 패키지, 다른 패키지 등 모든 위치에서 접근할 수 있습니다.
- protected
- 같은 패키지 내의 모든 클래스와 다른 패키지의 하위 클래스에서 접근가능
- 주로 상속을 염두에 두고 사용
- default (패키지 접근 제한자)
- 별도의 접근 제한자를 명시하지 않으면 default로 간주됩니다.
- 같은 패키지 내에서만 접근이 가능
- 다른 패키지에서는 접근할 수 X
- private
- 같은 클래스 내에서만 접근이 가능하며, 외부에서는 접근할 수 X
- 다른 클래스나 하위 클래스에서도 접근할 수 없고, 객체를 통해서도 접근할 수 X
- 주로 캡슐화를 위해 사용되어 내부 데이터나 메서드를 외부에서 보호하고,
필요 시에만 공개하기 위한 메서드를 따로 제공
10.
class Base {
public void test() {
System.out.println("Base ");
}
}
class DerivedA extends Base {
public void test() {
System.out.println("DerivedA ");
}
}
class DerivedB extends DerivedA {
public void test() {
System.out.println("DerivedB ");
}
public static void main(String[] args) {
Base b1 = new DerivedB();
Base b2 = new DerivedA();
Base b3 = new DerivedB();
b1 = (Base) b3;
Base b4 = (DerivedA) b3;
b1.test();
b4.test();
}
}
런타임 다형성
b4는 Base 타입이지만, DerivedA 타입으로 업캐스팅된 DerivedB 객체를 참조. 자바에서는 참조 변수의 타입(여기서는 Base 혹은 DerivedA)이 아니라, 객체의 실제 타입(여기서는 DerivedB)에 따라 오버라이딩된 메서드가 실행
'Certification > OCAJP' 카테고리의 다른 글
OCAJP 준비 (Q106 - Q125) (8) | 2024.11.13 |
---|---|
OCAJP 준비 (Q91 - Q105) (1) | 2024.11.07 |
OCAJP 준비 (Q66 - Q90) (2) | 2024.11.07 |
OCAJP 준비 (Q45 - Q65) (0) | 2024.11.06 |
OCAJP 준비 (Q01 - Q25) (0) | 2024.11.04 |