데브 코스/TIL

[TIL] Day 2

마데카솔라 2021. 8. 4. 01:02
반응형

오늘은 어제보다 더 많이 그냥 무심히 지나쳤던 내용에 대해 다시 들을 수 있었던 기회였다.

여태 거의 자바만 사용해왔는데, 정작 객체지향이 무엇인지 어떻게 사용해야 하는지 등등 잘 모르기 때문에 이참에 정리할 수 있는 기회가 되어서 좋다.

 

 

TIL

1. 객체지향

Java 언어를 처음 접할 때 가장 먼저 볼 수 있는 문구가 '객체지향 프로그래밍 언어'라는 문구다.

나는 단순히 클래스 별로 기능을 나눠 잘게 쪼개는 것이 객체지향이라고 이해하고 있었다. 하지만, 이에 더해서 살펴보아야 할 부분이 많았다.

 

객체지향 프로그래밍 : 말 그대로 객체로 프로그래밍하고, 프로그램을 객체로 구성하는 것이다.

과거에는 프로그램이 규모가 작아 그냥 진행하면 됐었지만, 점점 규모가 커지면서 해결책을 생각한 것이 '프로그램을 작게 나눠서 만들고, 합치자!' 라고 한다.

그렇기 때문에 각각의 객체는 맡은 작은 기능을 수행하고, 서로 협력해 큰 규모의 프로그램이 되는 것이다.

이 과정에서 굉장히 많은 객체가 존재할 수 있기 때문에 객체를 서로 구분해야 한다.

 

결론

(1) 하나의 객체를 만들고 각 객체들에게 기능을 제공한다.

(2) 객체에 어떤 책임을 부여할 것인지 정한다.

(3) 어떻게 협력을 하게 할 것인지 정한다.

 

* 추가로 과거부터 Instance의 의미를 모르고 그냥 지나쳤는데, 이번 기회에 살펴보려고 한다.

- 개념적 용어 : 객체

- 기술적 용어 : class, instance

라고 들었지만, 정확히 이해가 되지 않았다.

 

객체 : 구체적인 사물, 시스템 등.

Instance : 어떤 클래스에 속하는 각 객체. 클래스의 정의를 통해 만들어진 객체.

ex) 사람(class)이 있다면 대한민국의 사람들은 각 개인들의 인스턴스가 있는 것이다!

 

자세한 내용은 따로 포스팅하려고 한다.

https://hidelookit.tistory.com/240

 

[Java] 객체지향 프로그래밍(OOP)이란?

객체지향 프로그래밍이란? 부품에 해당하는 객체들을 먼저 만들고, 프로그램을 객체로 구성하는 것 프로그램 규모가 커지면서 생각한 해결책이 '프로그램을 작게 나눠서 만들고, 합치자!'이다.

hidelookit.tistory.com

 

 

2. 객체지향 특징

4개의 특징 중 추상화와 다형성에 대해서 살펴보겠다.

 

추상화란 객체들의 공통적인 특징을 뽑아내는 것이다.

이 뽑아낸 특징을 상속받아 하위 클래스들이 정의해 사용할 텐데 이 과정에서 추상체와 구상체가 구분된다.

그리고 이 관계에서 상위에 있는 객체가 항상 하위보다 추상적이어야 한다.

추상체 : 추상화된 객체

구상체 : 구체적인 객체

상속 관계

 

 

 

 

다형성이란 형(type)을 여러가지로 표현하는 것이다.

같은 이름의 메소드가 클래스 또는 객체에 따라 다르게 동작할 수 있는 것이다.

예시를 보는게 빠를 거 같다.

아래처럼 타입이 Go지만 상속받은 클래스들의 인스턴스를 만들어 다양한 형태로 선언이 가능하다.

class Go {
	void go() {}
}

interface Go {
	void go();
}

class Jump implements Go {
    void Jump() {}
    @Overrid
    void go() {}
}

interface Stop {
    void stop();
}

class Move implements Go, Stop {
    void move() {}
    @Override
    void go() {}
    
    @Override
    void stop() {}
}
Go go = new Go();
Go go = new Jump();
Go go = new Move();

 

추가로 객체지향에서는 누가 접근하느냐에 따라 필터링된 기능만 제공한다.

만약, 이외의 기능도 접근과 사용이 가능하다면 캡슐화가 깨진 것이다.

즉, 추상객체를 통해 다른 객체에 접근할 때 이러한 정보를 요청했을 때 권한이 있는 것만 추상된 형태로 줄 수 있고, 나머지 요청은 들어줄 수 없다.

 

 

 

3. UML

객체지향을 설명할 때 객체를 어떻게 구분했는지, 객체 간의 연관관계가 어떠한지 알면 설명이 가능하다.

위 설명을 하기 위해서 사용하는 도구가 UML이다.

다양한 다이어그램이 있지만 Class Diagram이 많이 쓰인다고 한다.

 

추상화에서 사용했던 그림을 다시 가져오자.

상속 관계

위 그림이 Class Diagram으로 클래스를 표기한 것이다. 위에서부터 클래스명, 필드 영역, 메서드 영역 순서다. 

효과적인 표현을 위해 화살표로 상속 관계를 표현한 것처럼 다양한 방식으로 관계를 표기한다고 한다.

 

화살표

실선은 상속(extends)을 표현하고 점선은 implements(인터페이스)를 표현한다.

추가로 마름모가 붙어있는 관계에 대해서 살펴보면

빈 마름모는 구성요소 중 하나이지만 굳이 없어도 되는 관계이다.

찬 마름모는 참조하는 객체가 꼭 필요하다.

빈 마름모
찬 마름모

 

 

 

느낀점

아직 2일 차인데 점점 버거운 느낌이 든다.

여태까지 이런 세세한 지식들을 무심히 지나쳤던 것에 대한 보복(?)을 받는 것 같다.

아직은 정리하는데 급급하지만, 계속 개선해나가면서 내 머릿속에 모두 집어넣고 싶다.

꾸준히 하면 될 것이라 믿고 계속 정리해나가야겠다.

 

 

 

 

참조

https://cooablue.tistory.com/entry/%EA%B0%9D%EC%B2%B4Object%EC%99%80-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4Instance

https://makerj.tistory.com/272

 

반응형