- 지역 변수:
- 메서드나 블록 안에서 선언
- 선언된 블록을 벗어나면 사용할 수 없음
- 기본적으로 외부에서 접근이 불가능하며, 접근 제한자가 필요하지 않음
- 멤버 변수:
- 클래스 수준에서 선언된 변수
- 클래스의 인스턴스(객체)가 소유
- 외부 접근을 제한하거나 허용하기 위해 private, public, protected 등의 접근 제한자를 사용할 수 있음
** 인터페이스의 메서드를 구현하지 않은 클래스는 추상 클래스로 선언해야 함
(명시되어 있지 않더라도)
Book book1 = new EBook(); 구문에 대해 <feat.다형성(Polymorphism)>
- Book 참조 변수를 사용해 EBook 객체를 참조
- **참조 변수의 타입(Book)**이 정의한 메서드만 호출할 수 있음
그러나, **메서드의 실행(실체화)**은 **실제 객체(EBook)**에서 구현된 메서드가 호출
** super.r은 유효하지 않은 구문
상속과 생성자의 관계
상속받은 클래스의 생성자는 반드시 상위 클래스의 생성자를 호출해야 함
- 암묵적으로 호출: 상위 클래스의 **기본 생성자(매개변수가 없는 생성자)**가 자동으로 호출
- 명시적으로 호출:
상위 클래스에 기본 생성자가 없고, 매개변수를 받는 생성자만 있다면, super(...)를 사용해 명시적으로 호출
acct.getAmount()는 getAmount() 메서드의 반환값을 가져옴.
이 반환값은 읽기 전용이며, 값을 설정하거나 변경할 수 XXXX
Exception은 Checked Exception이므로,
이를 호출하는 코드에서는 반드시 try-catch 블록으로 처리하거나, 메서드에서 다시 throws로 던져야 함
public class Test {
void readCard(int cardNo) throws Exception {
System.out.println("Reading Card");
}
void checkCard(int cardNo) throws RuntimeException {
System.out.println("Checking Card");
}
public static void main(String[] args) {
Test ex = new Test();
int cardNo = 12344;
try {
ex.readCard(cardNo); // Checked Exception 처리
} catch (Exception e) {
System.out.println("Exception caught: " + e.getMessage());
}
ex.checkCard(cardNo); // RuntimeException은 예외 처리 강제되지 않음
}
}
위와 같이 메서드 자체에도 트라이 캐치를 해주거나 main 메서드에 throws exception 해주어야 함
public static void main(String[] args) {
int x = 5;
while (isAvailable(x)) {
System.out.print(x);
}
}
public static boolean isAvailable(int x) {
return x-- > 0 ? true : false;
}
왜 x가 공용으로 사용되지 않는가?
- isAvailable 메서드의 매개변수 x는 복사본이다:
- isAvailable(int x) 메서드가 호출될 때, main 메서드에서 선언된 x 값이 메서드의 매개변수로 전달
- 하지만 이 전달은 값 복사 방식!!!!!!!
즉, isAvailable 메서드는 main 메서드의 원래 x를 수정할 수 없음.
메서드 내부에서 사용되는 x는 독립적인 복사본
- 서로 다른 스코프:
- isAvailable의 x와 main의 x는 서로 다른 메모리 공간에 존재
- isAvailable 메서드 내에서 x--가 실행되더라도, 이는 isAvailable 메서드 내부에서만 영향을 미치고, main 메서드의 x에는 영향을 주지 않음
Java에서 switch 문이 지원하는 타입:
- byte, short, char, int
- String (Java 7 이후)
- enum >> 열거형(enum) 데이터 타입으로, 상수들을 그룹으로 묶을 때 사용
enum과 컬렉션의 차이점
- 용도:
- enum: 미리 정해진 값의 집합을 표현 (상수 집합).
- 컬렉션(List, Set, Map): 데이터의 동적 집합을 저장하고 관리.
- 동적/정적:
- enum: 값이 고정되어 있으며 변경 불가능.
- 컬렉션: 값이 동적으로 추가, 삭제 가능.
- 구조:
- enum은 상수 값들만 포함하며, 이 값들은 enum 타입에 종속
- 컬렉션은 여러 타입의 객체를 저장할 수 있는 일반 데이터 구조
String s3 = String.valueOf(s1 + s2);
숫자 변환할 때. string에서 숫자연산값은 parse쓰면 됨
remove(Object o) 메서드는 리스트에서 첫 번째로 일치하는 요소를 제거
javac Greeting.java : To compile the program
java Greeting Duke : To run the program with argument "Duke"
- 인스턴스 변수:
- 객체마다 독립적으로 저장
- 생성된 객체마다 고유의 값
- 클래스 변수(static):
- 모든 객체가 값을 공유
discount = (qty >= 90) ? 0.5 : (qty > 80) ? 0.2 : 0;
앞에가 참이면 뒤 연산이 계산 안되어서 False라고 생각했는데,
90을 충족하지 못하면 90보다 작고 80보다 큰것은 0.2를 반환하기 때문에 True
Base b1 = new DerivedB();
Base b2 = new DerivedA();
Base b3 = new DerivedB();
b1 = (Base) b3;
Base b4 = (DerivedA) b3;
b1.test();
b4.test();
Base b4 = (DerivedA) b3;
- b3는 DerivedB 객체를 참조하, 이는 DerivedA를 상속했으므로 정상적으로 캐스팅
- 따라서 b4는 DerivedB 객체를 참조하지만, DerivedA 타입으로 선언
객체를 다루는 관점을 변경하는 것. 객체 자체는 캐스팅을 통해 타입이 바뀌지 않음
DerivedA는 Base를 상속했으므로, DerivedA에 정의된 메서드도 참조할 수 있게 됨
- 예를 들어, DerivedA에만 정의된 메서드가 있다면 이를 호출할 수 있음
>> 캐스팅은 컴파일러에게 객체의 실제 타입에 대한 정보를 추가로 알려주는 역할.
이를 통해 더 구체적인 타입의 메서드나 필드에 접근할 수 있음
'Certification > OCAJP' 카테고리의 다른 글
OCAJP 복습(3) (0) | 2024.12.09 |
---|---|
OCAJP 복습(2) (0) | 2024.12.08 |
OCAJP 준비 (Q219 - Q236) (1) | 2024.11.28 |
OCAJP 준비 (Q201 - Q218) (2) | 2024.11.27 |
OCAJP 준비 (Q177 - Q200) (0) | 2024.11.26 |