티스토리 뷰
Object 클래스는 Java의 최상위 클래스
: 모든 객체가 상속하며, 모든 객체는 Object 클래스의 메서드 사용 가능
🌼 Object Class 가 가진 메서드
- toString() : 객체의 문자열 표현 반환
- 기본 구현으로는 유용하게 쓰이지 않음.
어떤 객체에서 toString() 호출 시, 클래스 이름과 해시코드(메모리 주소 기반 정수값)가 포함된 문자열 반환.
(ex // ClassName@hashCode) 이는 객체에 대한 정보가 아닌 객체의 메모리 주소에 관한 정보.
- 오버라이드(Override)하여 사용
자신이 만든 클래스에서 toString()을 오버라이드(재정의) 하게 되면,
객체의 필드 값을 포함한 유용한 정보를 문자열로 반환할 수 있다.
(ex // Person Class → toString() 오버라이드 → "이름 : 홍길동, 나이 : 29" 같은 문자열 형식으로 반환 가능.)
- hashCode() : 객체의 해시코드 반환 메서드
(해시코드는 정수값이며 객체의 고유한 식별자)
- Object Class의 equals() 오버라이드 시, hashCode()도 필수 오버라이드.
비교할 두 객체가 같다고 판단되면 그들의 해시코드 또한 동일해야 하기 때문!
@Override public int hashCode(){ return Objects.hash(name, age); }
- 예를 들어 두 개의 Person 객체가 같은 필드(name, age)를 가졌다면,
이는 equals()에서 true를 반환 + hashCode()에서 동일한 해시코드(정수값)을 반환해야 함.
- equals(Object obj) : 두 객체가 같은지 비교하는 메서드
- 기본 구현으로는 두 객체가 동일한 메모리 주소를 가리키는지 확인
두 객체의 참조가 같은 경우에만 true를 반환
- 오버라이드 필요@Override public boolean equals(Object obj) { if (this == obj) return true; // 같은 객체일 경우 if (obj == null || getClass() != obj.getClass()) return false; // null 체크 및 클래스 비교 Person other = (Person) obj; // 타입 캐스팅 return this.name.equals(other.name) && this.age == other.age; // 필드 값 비교 }
단순히 메모리 주소 비교보다는 객체 상태 (ex // 필드 값) 비교가 훨씬 유용
≫ 예를 들어 Person 클래스가 이름과 나이를 필드로 가진 경우, 두 Person 객체가
같은 이름과 나이를 가지고 있다면 동일한 객체로 간주할 수 있게 된다.
- getClass() : 런타임에서 객체 클래스 정보를 반환.
- getClass() 메서드는 Class 객체 반환, 이를 통해 객체 타입 확인 혹은 리플렉션 사용 가능
- notify() / notifyAll() / wait() : 쓰레드 간의 통신을 위해 사용되는 메서드
notify() : 잠들어 있는(대기중인) Thread 중 임의의 하나를 깨움
notifyAll() : 잠들어 있는(대기중인) Thread 모두 깨움
wait() : 현재 스레드를 대기 상태로 만듦. (갖고 있던 고유 lock 해제, Thread 잠들게 함)
≫ 세 개의 메서드 모두 호출하는 스레드가 반드시 고유 락을 가지고 있어야 함
class SharedResource { private final Object lock = new Object(); public void producer() { synchronized (lock) { // 자원 생산 lock.notify(); // 대기 중인 소비자 스레드를 깨움 } } public void consumer() { synchronized (lock) { try { lock.wait(); // 자원이 없으면 대기 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // 자원 소비 } } }
- Synchronized 블록 내 실행되어야 함
- 동기화된 블록 외부에서 호출하는 경우 IllegalMonitorStateException 발생
해당 스레드가 그 객체의 모니터 락을 가지고 있지 않기 때문에 발생하는 예외
🍀 스레드(Thread) 의 개념
Thread란?
프로그램 내에서 실행되는 가장 작은 단위의 작업 의미
자바 같은 프로그래밍 언어에서 스레드를 사용해 동시에 여러 작업 수행 가능
- 프로세스와 스레드
- 프로세스 : 실행중인 프로그램, 메모리 공간과 시스템 자원 가짐.
각 프로세스는 독립적인 메모리 공간을 가지며 서로 간섭하지 않음.
- 스레드 : 프로세스 내 실행되는 작업의 단위.
같은 프로세스 안의 여러 스레드는 메모리, 자원 공유
같은 프로세스 내 스레드 간의 데이터 공유는 용이하나, 동기화 필요.
- 멀티스레딩
- 하나의 프로세스 내에서 여러 스레드를 동시에 실행하는 방식.
이를 통해 CPU 자원을 효율적으로 사용할 수 있고 반응성(응답성) 향상.
(ex // 사용자 인터페이스(UI) 스레드와 백그라운드 작업 스레드 동시 실행 가능)
- 스레드 생성
- 자바에서 스레드 생성법은 두 가지
1. Thread 클래스 상속 : Thread 클래스 상속 후, 새로운 클래스를 만들어 run() 메서드 오버라이드.
2. Runnable 인터페이스 구현 : Runnable 인터페이스를 구현한 클래스를 만들어 run() 오버라이드 후
Thread 클래스에 전달해 스레드를 생성한다.
'기술 공부 > Tech Interview' 카테고리의 다른 글
[Java] 자바 컴파일 과정 / JVM / 동적 로딩 (0) | 2024.10.21 |
---|---|
[Java] 문자열 클래스 + 고유 락과 동기화 (0) | 2024.10.04 |
댓글