[JAVA] OOP - Encapsulation(작성중)
Encapsulation: 데이터 은닉과 보호 위함.
- 정보 보호를 위해 멤버변수는 private로 보호하고, 공개되는 메서드인 getter 등을 통해 접근하도록 한다.
객체 생성 제어와 Singleton 패턴:
- 객체 생성을 제한해야 할 경우:
여러개의 객체가 굳이 필요없을때. 수정가능한 멤버변수가 없고 기능만 있는 클래스일때 (==stateless한 객체)
이런경우 계속 여러개를 생성하기보다는 하나 생성해서 재사용하는게 좋기 때문!
- Singleton이란:
생성자의 접근제한자를 private로 설정하고 내부에서만 직접 객체를 생성.
외부에서 private member에 접근가능한 getter가 필요하다 (setter는 필요할일 x)
객체 생성없이 외부에서 접근을 가능하게 하기 위해 getter() 또는 변수에 static을 붙여 객체생성없이 이용가능하게 함
외부에서 언제나 getter를 통해 참조하며 하나의 객체를 재사용하도록 하는것!
class SingletonClass {
private static SingletonClass instance = new SingletonClass();
public static SingletonClass getInstance() {
return instance;
}
public void sayHello() {
System.out.println("Hello");
}
}
public class SingletonTest {
public static void main(String[] args) {
// TODO:SingletonClass를 사용해보세요.
SingletonClass sc1 = SingletonClass.getInstance();
SingletonClass sc2 = SingletonClass.getInstance();
System.out.println(sc1==sc2);
}
}
위의 코드에서 sc1과 sc2가 동일한 SingletonClass 인스턴스를 참조하고 있기 때문에 sc1 == sc2의 결과는 true로 나온다.
이는 Singleton 패턴이 한 번의 인스턴스를 생성하고 그 인스턴스를 여러 곳에서 공유하여 사용하는 것을 보장하기 때문!
굿
Singleton 패턴의 특성:
- private static SingletonClass instance = new SingletonClass();: SingletonClass 내부에서 자기 자신의 인스턴스를 private static 변수로 생성합니다. 이 때, 인스턴스는 클래스가 로딩되는 시점에 생성되어 프로그램 실행 도중에 단 한 번만 호출됩니다.
- public static SingletonClass getInstance(): getInstance() 메서드를 통해 SingletonClass 인스턴스를 반환합니다. 이 메서드는 클래스 외부에서 호출 가능하도록 public으로 선언되어 있으며, SingletonClass 인스턴스가 없을 경우에만 새로 생성합니다.
- sc1 == sc2: sc1과 sc2는 동일한 getInstance() 메서드를 호출하여 같은 SingletonClass 인스턴스를 반환받았기 때문에, 이들은 동일한 객체를 참조합니다. 따라서 sc1 == sc2의 결과는 true입니다.
Singleton 패턴은 위와 같이 하나의 인스턴스를 공유하여 사용하므로, 메모리를 절약하고 객체를 중복 생성하는 것을 방지하는데 효과적입니다. 또한, 프로그램 전체에서 하나의 상태를 유지하는데 유용하며, 설정 값이나 로그 기록 등의 공통적으로 사용되는 인스턴스에 자주 활용됩니다.
다형성 - Polymorphism: 하나의 객체가 많은 형(타입)을 가질 수 있는 성질.
상속관계일때 조상클래스의 타입으로 자식 클래스 객체를 레퍼런스 할수 있다.
하나의 배열에서 다형성을 통해 다른 타입의 데이터들을 하나의 배열로 관리가능
ex) Object는 모든 타입들의 조상이므로 Object배열은 어떤 타입이든 저장 가능한것
ex) 무언가를 출력하는 메서드가 있다고 했을때 파라미터를 조상 타입으로 받는다고 한다면
타입들 별로 일일히 다 메서드를 만들 필요가 없어지는거
고마워 따봉polymorphism아 ~
객체의 형변환: 자손타입의 객체를 조상타입으로 참조 -> 형변환 생략가능! (조상의 모든 타입이 자식ㅇ)
-> 조상의 모든 타입이 자식에 있기때문에 문제 없음.
Phone p = new Phone();
Object obj = p;
but 반대로 상위타입에서 하위타입으로 변환할때는 명시적인 캐스팅이 필요하다!
Phone p = new SmartPhone();
SmartPhone sp = (SmartPhone) p;
그러나 이렇게까지만 하면 문법적으로는 ㄱㅊ 근데 하위타입의 멤버를 사용하려하면 런타임 에러가 발생한다.!
=> 조상을 무조건 자손으로 바꿀순 없고 instanceof 연산자가 필요하다. 실제 메모리의 객체가 특정 클래스타입인지 확인
컴파일은 ㄱㅊ은데 실제 실행할때 에러가 날수 있다. ClassCastException
instanceof 연산자: 생성된 객체의 타입 확인
언제 사용하는가? -> 부모타입으로 자식을 받았을때 자식타입 확인?
ex) 여러가지 타입들을 하나의 부모타입으로 관리할 경우, 이 개별적인 구성요소들의 타입을 따로 확인할 일이 있다.
예를들어 Book 배열 내에 Magazine타입만을 꺼내 사용할때도 사용할수 있음!
ex) Book 배열 내에서 Magazine정보를 제외한 모든 book객체들만을 출력하고자 할때
if (~ instance of Book) { ..출력 .. => 이렇게하면 모든 Book배열 내의 객체들이 다 출력된다.
대신에 !(~instance of Magazine) { .. => 이렇게 하면 원래 의도대로 매거진을 제외한 나머지 책들만 출력된다.
equals / 해시코드
객체를 고유하게 구별하는 번호가 해시코드, 해시코드값과 equals메소드는 오버라이딩 할 일이 종종 있다