티스토리 뷰

 

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 클래스에 전달해 스레드를 생성한다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함