끄적끄적 코딩일지

22.05.22 2주차 WIL(객체지향 프로그래밍, SOLID, JVM) 본문

WIL

22.05.22 2주차 WIL(객체지향 프로그래밍, SOLID, JVM)

BaekGyuHyeon 2022. 5. 22. 21:05

1. 객체 지향 프로그래밍(Object Oriented Programming)


컴퓨터 프로그래밍의 체계중 하나로 프로그램을 명령어 목록으로 보는 시각을 벗어나 여러 개의 독립된 객체들의 모임으로 파악하는것. 즉 추상화를 통해 객체를 만들고 객체들간의 상호 작용을 통해 데이터를 제어하는 프로그래밍을 말한다. 유연하고 변경이 쉽다는 특징이 있어 대규모 소프트웨어 개발에 많이 사용된다.

 

 

2. 객체지향 프로그래밍 키워드


1. 클래스(class) / 인스턴스(객체)

클래스데이터를 제어하기 위해 추상화를 거쳐 속성, 행위를 변수와 method로 정의한것

ex) 자동차를 class화 한다면 속성은 속도, 자동차 번호, 차종, 주유량 등이 있을것이고 행위는 속도 변경, 주유하기, 번호판 교체등이 있을것이다. 위에서 속도를 각각 변수로 정의하고 행위를 method으로 정의한것

 

인스턴스(객체)래스를 토대로 실제 메모리에 할당된 것을 의미한다. 쉽게말해서 도로위에 다니는 자동차 하나하나가 자동차 클레스를 토대로 만든 인스턴스라고도 할 수 있다.

 

2. 추상화

추상화공통의 속성이나 기능을 정의하는것. 예로들자면 모든 자동차들의 공통적으로 가지고 있는 속성(ex) 속도, 번호, 차종, 주유량등)과 기능(ex) 속도 변경, 주유하기, 번호판 교체등)을 정의한 것이다.

 

3. 캡슐화

캡슐화(1) 코드를 재수정 없이 활용하고, (2)접근 제어자를 통한 정보 은닉을 목적으로 객체가 외부로 노출하지 말아야할 정보를 보호하고 접근제허자를 통해 제어 권한이 있는 객체에서만 접근하도록 할 수 있도록 한다. 이는 수정이 발행했을때 책임이 있는 객체만 수정하면 되므로 수정발생시 영향 범위가 줄어들고 관련된 기능과 특성을 한곳에 모으고 분류하기 때문에 객체 재활용이 원할해진다.

 

자동차를 예로 들면 속도를 제어하는 행위는 운전자(제어 권한이 있는 객체)가 엑셀 또는 브레이크를 직접 밟아야지만 (접근 제어자를 통한 접근) 변경이 가능하도록 하는것이다.

 

4. 상속

상속부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하고 일부 변경이 필요한 경우 해당 부분만 다시 수정(Override)하여 사용할 수 있도록 하는것이다.

예를들어 전기차가 자동차 클래스를 상속받고 주유대신 충전이라는 method를 만들거나 주행하면서 주유량이 떨어지는 기능을 충전량이 떨어지는 행위로 재정의하는등을 의미한다.

 

5. 다형성

다형성하나의 변수명이 상황에 따라  다른 의미로 해석될 수 있는것을 의미한다.

즉 Overriding(부모클래스의 매서드와 같은 이름으로 매개변수나 매서드등을 재정의 하는것)이나 Overloading(같은 이름의 함수를 여러개 정의하고 매개변수를 다르게 하는것)이 가능하다.

 

예를들어 자동차 클래스의 주유를 정의할때 refuel이라는 똑같은 이름의 경유, 가솔린, 휘발유를 입력받는 매소드를 정의하던가 자동차 클래스를 상속받은 K5클래스가 경유, 휘발유는 잘못된 주유임으로 주유량 상태를 변경하지 못하도록 재정의 하는것이 가능하다는것.

 

 

 

3. 객체지향개발 5대 원리(SOLID)


SOLID란 로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 설계의 다섯가지 기본 원칙을 소계한 것이다.

 

1. SRP : 단일 책임 원칙(Single Responsibility Principle)

한 클래스는 하나의 책임만 가져야 한다는것.

ex)자동차 클래스는 자동차 기능에 대한 책임만 있으면 된다. 운전자나 동승자에대한 속성이나 기능을 가져서는 안된다.

 

2. OCP : 개방-패쇄 원칙(Open / Close Principle)

소프트 웨어 요소는 확장에는 열려있으나 변경에는 닫혀 있어야 한다.

처음 들었을땐 이게 뭔 개소린가 하였다. 예시를 들자면 K5클래스를 만들때 최소한의 기능을 자동차 클래스넣어 이를 상속받도록 만들면 나중에 K3, K7등을 만들필요성이 생길때 자동차 클래스를 활용하여 만들수 있어야 한다는것.(확장) K3, K7 클래스를 만든다고 K5 클래스 코드 전체를 복붙하거나 K5 클래스를 수정하여 K3으로 만드는 일(변경)이 없어야 한다는 것이다.

 

3. LSP : 리스코프 치환원칙(Liskov Substitution Principle)

프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀수 있어야 한다는것

쉽게 말하면 부모클레스는 자식클레스로 바꿀수 있어야 한다는것이다.

즉 Car car = new K3(); 으로 정의했을때 작동에 문제가 없어야 한다는것. 이를 잘 지키면 후에

Car car = new K5(); / Car car = new K7();등으로 바꾸어도 작동에 문제가 없으므로 수정할 일이 줄어들고 관리가 

용의하다.

 

4. ISP : 인터페이스 분리 원칙(Interface Segregation Principle)

특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다라는 의미이다. 

위에서 자동차 클래스를 예시로 들때 자동차 클래스를 상속받은 자동차의 주유 종류에 따라 맞지 않은 주유는 모두 재정의를 해야한다. 즉 휘발유를 사용하는 차량이라면 경유와 가솔린을 주유하는 경우를 재정의해서 주유하지 못하도록 막아야 한다는것. 때문에 자동차 클래스를 휘발유 자동차, 경유자동차, 가솔린 자동차으로 나누어 만들어 쓰면 주유 Method를 재정의할 필요성이 없어진다.

 

5. DIP : 의존관계 역전 원칙(Dependency Inversion Principle)

추상화에 의존해야지 구체화에 의존하면 안된다는 원칙. Spring의 의존성 주입(Dependency Injection : DI)은 이 원칙을 따르는 방법중 하나다.

예를들어 위와 같이 Car car = new K7();이라고 하면 Car이라는 추상화와 K7이라는 구체화에 의존하고 있는샘.

위의 LSP원칙에 의해서 작동은 문제가 없더라도 코드를 관리할때는 상당히 번거로워진다. Car을 K3으로 전부 교체해야할 수정이 발생하면 해당 부분을 전부 찾아야 하기 때문. 때문에 생성자를 통해서 이를 제어한다.

Car car;

public ClassName(Car car){
	this.car = car;
} 


// 후에 사용할때
ClassName n = new ClassName(new K3());

이를 분리하는 이유는 나중에 Car뿐만 아니라 다른 것을 수정하더라도 하나의 파일 내에서만 수정이 가능하도록 하는것이다.

 

4. JVM(Java Virtual Machine)


Java의 특성으로 Java를 실행하기위한 가상기계라는 뜻이다. 즉 Java는 OS와 별개로 돌아갈수 있다는 특징이 있다는것. 하지만 반대로 의미하면 Java파일을 실행시키기 위해서는 JVM이 필요하다.

단순하게만 보면 Java 프로그램을 실행시킬때는 Java 프로그램+JVM을 실행해야 하기 때문에 다른 언어로 작성한 프로그램보다 더 많은 자원을 소모할것 같지만 JVM이 자동적으로 Java 프로그램에서 사용하는 메모리를 최적으로 관리하기 때문에 개발할때 메모리관리에 신경을 덜 써도 되고(아예 안써도 된다는것은 아니다.) 프로그램의 성능을 보장해 준다는 특징이 있다.

 

1. Class Loader

클래스 파일을 로드하고 배치하는 모듈

 

2. Execution Engine

ClassLoader를 통해 Runtime Data Area에 배치된 바이트 코드를 읽어 실행하는 모듈

 

3. Garbage Collector

Heap Area에 생성된 객체들중 참조되지 않은(더이상 사용되지 않는) 객체를 탐색후 제거

메모리 관리의 중심적인 역할

 

4. Runtime Data Area

Java 프로그램을 실행할때 사용되는 데이터 영역. Method Area, Heap Area, Stack Area,PC Register, Native Method Stack으로 구분된다.

 

​      1. Method Area : 모든 쓰레드가 공유하는 메모리 영역. 클래스, 인터페이스,메소드,필드,스테틱 변수등 Java프로그           램을 작동시키는데 필수적인 데이터를 보관한다.

  

      2. Heap Area : 모든 쓰레드드가 공유하며 new 키워드로 생성된, 즉 프로그램이 필요에 따라 생성한 객체와 배열이           저장되는 영역. Garbage Collector가 더이상 사용되지 않는 메모리를 확인하고 제거하는 영역이다.

 

      3. Stack Area : Method를 실행시키면 해당 Method안에서 사용되는 값들을 저장을 임시 저장하는 공간. Method실           행이 끝나고 return시 해당 공간을 삭제시킨다.

 

      4. PC Register : 쓰레드가 시작될 때 생성되는 공간. 해당 쓰레드가 어떤 부분을 무슨 명령으로 실행할지를 저장하           고있다.

  

      5. Native Method Stack : 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역

 

 

'WIL' 카테고리의 다른 글

22.06.26 7주차 WIL  (0) 2022.06.26
22.06.19 6주차 WIL  (0) 2022.06.19
22.06.12 5주차 WIL  (0) 2022.06.12
22.06.05 4주차 WIL  (0) 2022.06.05
22.05.29 3주차 WIL  (0) 2022.05.29