241010 TIL - Java 스터디 정리 1

J_log·2024년 10월 10일
0

Java 스터디 정리

목록 보기
1/5
post-custom-banner

얕은 복사

  • 객체의 참조만 복사하는 방식. 새로운 객체를 생성하지만 객체 내에 포함된 필드의 주소값만 복사하기 때문에 원본 객체와 복사된 객체가 같은 참조를 가리키게 된다.

  • 기본형 필드는 값을 그대로 복사한다.

  • 참조형 필드는 참조하는 객체의 주소값만 복사한다. 즉 복사된 객체와 원본 객체는 같은 객체를 가리킨다.

  • 메모리 효율적이지만, 원본 객체나 복사된 객체 중 하나에서 참조하고 있는 객체를 변경하면 다른 객체에도 영향을 미친다.

class Person {
    String name;
    int age;
    
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

class Main {
    public static void main(String[] args) {
        Person person1 = new Person("John", 25);
        Person person2 = person1;  // 얕은 복사
        
        person2.name = "Alice";  // person2의 이름을 변경
        System.out.println(person1.name);  // 결과: "Alice" (person1도 영향을 받음)
    }
}

깊은 복사

깊은 복사는 객체의 모든 필드를 새롭게 복사하는 방식. 기본형 필드뿐만 아니라 참조형 필드까지도 새로운 객체로 복사하여, 원본 객체와 복사된 객체가 독립적인 객체가 된다.

  • 참조형 필드도 복사할 때 참조하고 있는 객체 자체를 새로 생성하여 복사한다.
  • 원본 객체와 복사된 객체가 독립적이므로 하나의 객체에서 변경이 발생하여도 다른 객체에 영항을 미치지 않는다.
class Person implements Cloneable {
    String name;
    int age;
    
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 깊은 복사를 위한 메서드
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new Person(this.name, this.age);  // 새로운 객체 생성
    }
}

class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person("John", 25);
        Person person2 = (Person) person1.clone();  // 깊은 복사
        
        person2.name = "Alice";  // person2의 이름을 변경
        System.out.println(person1.name);  // 결과: "John" (person1은 영향 없음)
    }
}

정리

  • 얕은 복사: 객체의 참조 값만 복사하여 원본과 복사본이 같은 객체를 참조.
  • 깊은 복사: 객체 자체를 복사하여 원본과 복사본이 독립적인 객체로 존재.

얕은 복사는 성능 면에서 유리할 순 있지만 참조형 객체에 대해 의도하지 않은 변경이 일어날 수 있어 주의해야 한다. 깊은 복사는 안전하지만 더 많은 메모리를 사용하고 복사 과정이 복잡할 수 있다.


접근 제어자

제어자는 클래스, 변수, 메서드의 선언부에 사용되어 멤버 또는 클래스에 사용, 외부에서 접근하지 못하도록 제한한다.

  • 클래스, 멤버 변수, 메서드, 생성자에 사용되고 지정되어 있지 않다면 default이다.
    • public: 접근 제한이 없다.
    • protected: 같은 패키지 내에서, 다른 패키지의 자식 클래스에서 접근이 가능.
    • default: 같은 패키지 내에서만 접근이 가능
    • private: 같은 클래스 내에서만 접근이 가능

접근 제어자를 이용한 캡슐화

  • 접근제어자는 클래스 내부에 선언된 데이터를 보호하기 위해서 사용한다.
  • 유효한 값을 유지하도록, 함부로 변경하지 못하도록 접근을 제한하는 것이 필요.

상속

  • 부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있다.
  • 상속을 사용하면 적은 양의 코드로 새로운 클래스를 작성할 수도 있고 공통적인 코드를 관리하여 코드의 추가와 변경이 쉬워질 수도 있다.
  • 이러한 특성 때문에 상속을 사용하면 코드의 중복이 제거되고 재사용성이 크게 증가하여 생산성과 유지 보수성에 매우 유리하다.

public class 자식클래스 extends 부모클래스 {
}

extends키워드를 사용하여 정의할 수 있다

post-custom-banner

0개의 댓글