Lewis's Tech Keep

06/20 TIL (OO적 상호작용~ static, 싱글턴, 내포클래스) 본문

JAVA/개체지향 프로그래밍 with JAVA

06/20 TIL (OO적 상호작용~ static, 싱글턴, 내포클래스)

Lewis Seo 2021. 6. 20. 19:49

 - 행동을 하기 위해서 개체 자체를 넘긴다.

 : 스프레이 안 쪽에 스프레이 로직만 들어가기 때문에 좀 더 개체 지향적이게 된다.

 : 복잡한 로직도 클래스 안에 숨길 수 있게 된다.

 

 - 개체 : 생물체 + 물체 

 : 물체에게도 주체성이 있게 됨.

 

 - 유연성 떨어진다 : 재활용성이 떨어졌다.

 : 재활용성을 높이면 유연성도 올라간다.

 

 - 사람의 사고방식

: 위에서 아래로 가 가장 자연스럽다 (파일을 너무 많이 점프하면 힘들어진다.)

 

 - 코드 유연성은 양날의 검 

 : 유연성 높 -> 성능 낮, 가독성 낮, 재사용성 높

 : 유연성 낮 -> 성능 높, 가독성 높, 재사용성 낮

 

 - 안 유연해도 괜찮아! 

 : 절대반지는 없음, 유연성 필요는 회사마다 다름

 

 - 필요에 따라 유연성을 유연하게 조정할 것

 

 - 기본기의 중요성

 : 읽기 명확한 코드 만들기

 : 실수 저지르기 어려운 코드 만들기

 : 문제를 해결하는 코드 만들기 (유연성보다는 일단 해결 -> 유연성으로 변경)

 : 문제가 생기면 디버깅 하기

 

 - 간단하게 만들기

 : 미리 규격을 정한다 ->용량을 정확히 몰라도 됨.

 : 책임을 상위 집합으로 전가 -> 하위에서 왔다 갔다 하지 않아도 된다.

 

 - static 필요성

 : 모든 것이 개체 속에 있을 때의 불편함

 : 개체 단위가 아니라 그 상위의 클래스 단위에서 뭔가 하고 싶을 때

 

 - 정적 멤버 함수의 소유주

 : 개체가 아니라 클래스 소속이다 (= 클래스가 소유주다)

 

 - static의 생성자

 : 개체 생성자 만들지 못하는 것 아님

 

 - static을 new로 만들어도 static method가 호출 가능한 이유

 : 여러 개를 만들어도 static은 클래스에 속한 1개라서 접근 가능하므로 허용

 : 반대의 경우는 컴파일이 아예 안 된다.

 

 - static 생성자가 굳이 만들 필요가 없는 경우

 : 생성자를 private으로 만들어 버리면 된다.

 : 무시하면 컴파일 오류

 

 - static 멤버 변수

 : 클래스 통틀어서 뭔가 멤버 변수가 필요할 것 같은 상황에서 사용

 

 - static 메서드

 : static 멤버 변수 컨트롤 할 때 좋은 위치 -> 생성자

 

 - static에 대한 비판

 : 그룹 1 모든 것은 개체여야 한다 -> 개체 소속이 아니기 때문에 안 좋다고 생각하는 사람들이 있음

 : 그룹 2 타 언어 진영 -> low level language가 아닌 언어가 static을 챙겨야 하게 된 것은 잘 생각한 것이 아니다.

 : static 자체가 OO의 개념과 먼 것은 사실 -> 그치만 OO의 개념과 멀다고 잘못된 방법은 아니다.

 

 - 디자인 패턴

 : 인간은 최고의 패턴 인식 기계

 : 인간 문제 해결 과정 : 새로운 문제를 접함 -> 과거의 비슷한 문제를 찾음 -> 해결 방법을 새 문제에 적용

 : 곧바로 적용할 수 없는 참고 가이드를 '패턴'이라 부를 수 없다.

 

 - Singleton 패턴

 : 어떤 클래스에서 만들 수 있는 인스턴스 수를 하나로 제한하는 패턴

 : 프로그램 실행 중에 개체는 최대 하나 (ex. ) configuartion file, file system)

 : singleton static private 멤버 변수 생성 && getInstance() 로 가져 옴

 

 - Singleton vs static (차이점)

 : static으로는 못하지만 singleton으로는 가능한 일 (다형성 사용 가능)

 : multiton 패턴으로 변경 n개의 instance를 제한하는 패턴이 가능

 : 개체 생성 시점 제어 가능하다.

 

 - 개체 생성 시기

 : 처음으로 getInstance() 메서드가 호출될 때

 : 여러 군데에서 getInstance() 메서드를 동시에 호출 할 때 (순서가 중요해 질 때가 있음)

 

 - Singleton 초기화 순서 보장

 : 프로그램 시작 시 여러 싱글턴의 getInstance() 순서대로 호출하면서 호출 순서를 맞춰야 한다.

 

 - Singleton 생성 시 인자가 필요한 경우의 해결 (다른 곳에서 인자의 주입 개념이 어려워 짐)

 : 자신의 타입을 멤버 변수로!

 : 프로그램 실행 시에는 createInstance() 로 설정

 : getInstance()에는 인자를 넣지 않아도 괜찮게 됨 (createInstance 가 먼저 호출됐다는 가정이 있어야 작동)

 : 프로그램 종료 시에 직접 시스템 리소스를 해제해야 하는 경우가 있다면 deleteInstance()를 반드시 호출해 줘야 함. 

 : Singleton을 쓰지 않을 수도 있지만 쓰지 않고 static을 써서 코드가 더 복잡해진다면 굳이 static을 고집할 이유가 없다.

 

 - 내포 클래스

 : 클래스 안에 다른 클래스가 들어가 있는 모습

 : 비정적 내포 클래스(내부 클래스라고 부름), 정적 내포 클래스 로 나뉨

 : 바깥 클래스의 private 멤버에 접근 가능 (바깥 클래스는 내포 클래스의 private 접근 불가)

 

 - 내포 클래스 바깥 클래스의 멤버에 바로 접근 가능다른 

 : private 멤버라도 접근이 가능

 : 다른 바깥 클래스 개체를 메서드의 매개변수로 받아도 마찬가지로 private 멤버에 접근 가능

 : 강한 캡슐화 (패키지 접근 보다)

 : 내부 클래스와 외부 클래스가 대응하고 있다는 연결점을 만들어 주어야 함(A.new B());

 

 - 정적 내포 클래스

 : static 내부 클래스가 여전히 바깥 클래스의 private 멤버에 접근 가능하지만 A 클래스를 선언 해 주어야 함

 : static 클래스라는 의미가 아님

 : 바깥 클래스의 레퍼런스를 받지 않겠다는 뜻임 (바로 위에 있는 것을 자동 적용 안될 것이다)

 : A a 로 선언 & 할당하는 과정이 필요

 : A.new B() 가 아니고 new A.B(a);가 됨

 : 바깥 클래스의 static은 접근이 가능 (왜냐면 클래스 아래에 있기 때문)

 

 

 

 

 

 

'JAVA > 개체지향 프로그래밍 with JAVA' 카테고리의 다른 글

중간 반성  (0) 2021.06.23
6/21 TIL (상속)  (0) 2021.06.21
06/17, 19 TIL (개체 모델링~)  (0) 2021.06.17
06/17 TIL (접근 제어자~ getter/setter)  (0) 2021.06.17
06/15 TIL (클래스와 개체)  (0) 2021.06.15
Comments