[회고일지] 항해99 2주차

 

항해99 2주차를 마치는 시점이다. 이번주차는 설날이  겹쳐 상대적으로 시간 자유롭게 활용 할 수 있어서 더욱 마음편하게 공부할 수 있는 시기다.

명절 당일 날 오후에 갑자기 내장 무선 랜 고장으로 정말 당혹스러운 일도 겪지만 이번 항해 대박나려나보네..ㅎㅎ 

 

내가 진행하고 있는 12기의 경우 명절이 겹쳐있다보니 언어 기본기 주차가 상대적으로 길어졌다고 한다. 그러다보니 Java공부를 상대적으로 주차에 맞춰서 진행할 수 있는 시기가 늘어난 것이다. 개인적으로는 물론 다른 여러요소들도 중요하지만 무엇보다 자신이 개발하고 있는 주언어에 대해서는 정말 잘 알고 있어야 된다고 생각한다.  그 중 특히 Java에서 객체지향프로그래밍은 정말 굉장히 중요한 부분이다.  예를들어 다형성, 추상화, 캡슐화, 오버라이딩, 참조변수 형변환, 인터페이스 등등 정말 너무 핵심적인 내용들이 많은 파트이다. 내가 공부를하면서 느낀 것은 최종적으로는 확장성을 높이면서 유지보수에 좋은 구조를 설계하고 코드로 구현하는 것이 핵심이라 생각한다. 

 

JAVA 언어하면 보통은 객체지향이 떠오르지 않을까? 조심스레 생각해본다

 

객체지향프로그래밍

- 프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다.

-객체란 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음으로 봐야 한다.

서술의 편의상 객체지향을 Java 위주로 ......

 https://namu.wiki/w/%EA%B0%9D%EC%B2%B4%20%EC%A7%80%ED%96%A5%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 

객체 지향 프로그래밍 - 나무위키

프로그램의 세부 구현을 외부로 드러나지 않도록 특정 모듈 내부로 감추는 것이다. 내부의 구현은 감추고 모듈 내에서의 응집도를 높이며, 외부로의 노출을 최소화하여 모듈 간의 결합도를 떨

namu.wiki

 

위에는 나무위키에 설명되어 있는 객체 지향 프로그래밍에 대한 부분이다. 설명 중 핵심이라고 생각하는 부분들을 표시해봤다. 

 

객체지향프로그램을 공부하다보면 유지보수, 중복제거, 확장성 같은 말을 많이 듣고 볼 수 있다. 그 중에 내가 이번주 객체지향프로그래밍 파트를 공부하면서 크게 느낀 부분은 유지보수에 용이하다는 말이다. 그 전까지는 이러한 말을 들어도 별 다른 느껴지는 것이 없었는데, 좋은 객체지향프로그램을 설계하기 위한 원칙인 SOLID도 배우고 실제로 적용도 해보면서 더욱 크게 느껴졌다.  이 부분은 객체지향프로그래밍 파트와 연결해서 보니 더욱 좋았다. 

 

다형성이라는 개념을 생각해보면 여러개의 객체를 생성하기 위한 클래스를 정의할 때 동일한 기능을 수행하지만,  개별적으로 정의되어있는 경우 중복되는 부분을 하나의 클래스에 정의하고 해당 클래스를 상속받음으로 중복되는 부분을 제거할 수 있다(=추상화). 이때 핵심은 중복되는 부분을 묶었지만 오버라이딩을 통하여 상속받은 클래스에서 자신의 기능에 맞도록 재정의하여 사용할 수 있다는 것이다. 이 부분이 정말 놀랍고 굉장히 프로그램이 유연해지는 부분이라 생각이 든다. 사실 여기까지만으로는 크게 와닿지 않는다. 이때 다형성을 생각해볼 수 있다.

 

즉,  참조변수 타입을 부모로 선언할 경우 자신의 타입 + 상속받은 자식타입 인스턴스는 모두 참조할 수 있다는 것이다. 이것이 왜 놀랍다고 생각을 하냐면 서두에 말한 유지보수관점에서 생각해볼 때 엄청난 것이다. 즉, 내가 필요에 따라 부모클래스를 상속받아서 얼마든지 자식 클래스를 확장할 수 있으며, 오버라이딩을 통해서 또다른 형태로 동작하도록 만들 수 있다. 이때 이렇게 확장한 객체를 사용하려면 기존에 인스턴스를 생성하던 부분들을 변경해야줘야한다. 이때, 다형성을 사용했기에 단순히 인스턴스만 변경할 때 참조변수타입까지는 변경하지 않아도 된다. 만약 해당  클래스 관련하여 인스턴스를 생성해서 사용했던 부분이 여러군데라면 어떨까? 유지보수하면서 곡소리 나는 것이다. 

 

추가적으로 자바는 단일상속이기에 하나의 클래스만 상속받을 수 있다. 그러나 낙담할 것 없는게 인터페이스를 활용하면 유연성과 확장성을 어마어마하게 활용할 수 있다. 인터페이스는 다중으로 사용할 수 있기 때문이다. 그렇기에 필요한 기능들을 미리 인터페이스에 명시해두고 단순하게 필요한 인터페이스들을 implements 하여 정의된 메서드들을 자신에 맞도록 구현해주면 된다. 이 경우도 위와같이 인터페이스로 참조변수타입을 지정하면 해당 인터페이스를 구현한 구현체는 모두 참조할 수 있게 된다. 거기에 추가적으로 인터페이스를 구현한 구현체에서는 반드시 인터페이스에 정의된 추상메서드들을 구현해야하기에 사용하는 쪽에서는 인터페이스에  명시되어 있는 메서드 선언부만 보고 호출하면 되는 것이다. 그럼 인터페이스가 참조하고 있는 구현체의 오버라이딩 한 메서드가 호출 될 것이다. 추가적으로 인터페이스,추상클래스는 인스턴스 생성을 할 수 없다. 

 

JVM

다음으로 객체지향프로그래밍을 배우다보면 자연스레 static 멤버, 인스턴스 멤버라는 말들을 보게된다. 이번 주차를  공부하면서 static, 인스턴스멤버들에 대해서 공부하면서 JVM 메모리 영역이라는 것을 다시한번 살펴보게 되었다. 사실은 엄청 이것저것 있는데 현재 시점에서는 대표적인 3개의 영역위주로 생각해봤다.

다음  그림에서 한번에 정리해서 볼 수 있다. 현재는 JVM에 대해서 깊은 이해보다는 Class를 생성하는데 있어서 변수를 선언하는 위치에 따라서 다음과 같이 JVM이 할당 받은 메모리 중 다음과 같이 나누어져 생성이 된다. 그 중 인스턴스 변수, 클래스 변수 부분을 나누어보면 클래스영역에 생성되는 클래스 변수는 .java 소스파일을 컴파일러가  컴파일할 시 클래스 파일이 생성되는데  생성된 바이너리형태의 파일을 보면 확인을 해 볼 수 있다.  추가적인 인스턴스 생성없이 Class명.xx 로 바로 사용할 수 있다. 그에 비해 인스턴스멤버들은 인스턴스 생성과정을 거쳐 힙 영역에 생성을 해야 사용할 수 있게 된다.

 

 

공부하면서 놓칠 수 있거나 한번정도는 상기했으면 하는 부분들을 적어보면서 한 주를  정리해봤다.

'TIL & WIL > WIL' 카테고리의 다른 글

[회고일지] 항해99 실전프로젝트 1주차  (0) 2023.03.22
[회고일지] 항해99 5주차  (2) 2023.02.19
[회고일지] 항해99 3주차  (3) 2023.02.05
[회고일지] 항해99 1주차  (0) 2023.01.22
[회고일지] 항해99 0주차  (2) 2023.01.15