객체지향.. 이제는 좀 알자 !

sonny·2024년 10월 31일
17

TIL

목록 보기
27/48

우선 객체 지향 프로그래밍 이라는 뜻을 알아야하기 때문에 살펴보자면 계산기를 만들 때 이따금씩 듣게 되었던 OOP 가 객체 지향 프로그램이었다.

Object-Oriented Programming, OOP

어떤 데이터를 입력 받아 순서대로 처리하고 결과를 도출해내는 명령어들의 목록으로 보는 시각에서 벗어나서,

여러 독립적인 부품들의 조합, 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임을 의미한다고 한다.

하. 그래도 어렵다. 그럼 이해하기 쉽게 하나하나 나눠볼까.

객체지향 프로그래밍의 4가지 특징이 있는데 추상화, 상속, 다형성, 캡슐화 로 나뉜다.

그래 마치 이렇게 떠 받드는 느낌이다.

우선 우리는 객체 지향 이라는 단어에서 '객체' 가 무엇인지 먼저 알아야 한다.

객체는 객체 지향 프로그래밍의 기본단위이자 시작점이라고 하는데

클래스가 설계도라면, 객체는 그 설계도로부터 만들어진 실제 물건에 비유할 수 있다.

객체지향 프로그래밍이 뭔지 검색하는 순간 예시로 정말 많이 나오는 자동차 예시들을 봤다. 나도 그 예시를 한번 이용해보려한다.

  • 클래스는 설계도!

  • 이 설계도를 가지고 만든 실제 자동차 한 대가 바로 객체!

클래스라는 설계도를 바탕으로 실제 자동차를 만들었다면 그 자동차가 하나의 객체가 되는 것이다.

코드로 보면 car 라는 설계도를 먼저 만들고,

myCar 라는 자동차를 만들면 이게 하나의 객체가 된 것이다.

그럼 이제 알것이다. 아 객체는 저기서 myCar 구나!

그리고 Car 클래스를 통해 여러 대의 자동차 객체도 만들 수 있겠구나!

자 그러면 이제 본격적으로 위에 짤에서 보았던 객체지향의 4가지 특징을 살펴보면서

그 특징들이 객체 지향에 어떻게 녹여지고 있는지 알아보자.


1. 추상화 (Abstration)

추상화? 그림 아니다.

쉽게 설명하자면, 복잡한 것들 중 꼭 필요한 부분만 뽑아 단순화 하는 것이라고 할 수 있다.

추상화 그림도 자세히 보면 작가가 의도하고자 하는 본질은 느낄 수 있지만 세세한 느낌보단 단순한 느낌이 많다.

프로그래밍에서 추상화도 비슷한 것이다!

필요한 기능이나 특징만 쏙쏙 뽑아 클래스나 메서드로 표현해주고!

복잡한 세부사항은 감춘다.

예를 들면 전에 계산기를 만들때도 덧셈이나 뺄셈 같은 기능만 신경쓰면 되지, 그 계산이 내부에서 어떻게 수행되는지까지는 알 필요가 없는 것처럼 말이다.

이 코드에서 추상화 된 부분이 보이는가.

추상화 된 부분은 add() 메서드가 덧셈만 수행하고 복잡한 세부사항은 감추었다는 점이다.

솔직히 add() 함수가 내부적으로 어떤 방식으로 덧셈을 수행하는지 몰라도 calc.add(5, 3) 처럼 함수만 호출하면 바로 덧셈 결과를 받을 수 있다.

이게 바로 추상화다.

난 그래서 처음에 아 그럼 func 같은 문법이 추상화란건가? 했는데,

추상화의 핵심은 func 같은 문법이 아니라, 복잡한 코드나 과정을 숨기고,

필요한 기능만 간단하게 보여주는 방식이라고만 알고 있으면 된다.


2. 상속 (Inheritance)

처음 상속에 대해 배울 때 자바의 문법요소라고 알려줘서 swift랑 관련 없나보다 했는데,

자바 뿐만 아니라 여러 객체지향 언어에서 공통으로 사용하는 문법 요소였다.

Swift, Java, Python, C++ 등 다양한 객체지향 언어에서 상속을 지원하는데,

다만 각 언어만다 상속을 사용하는 방법이나 문법이 조금 다를 뿐인거다.

그럼 상속에 대해 쉽게 이해해보자.

상속은 기존에 만든 클래스, 그럼 부모클래스겠지?

그 부모 클래스를 바탕으로 새로운 클래스인 자식클래스를 만드는 것이다.

부모 자식의 관계,, 애틋한 뭐 그런 관계이다.

자식 클래스는 자식답게 부모클래스의 속성과 기능을 물려받아 사용할 수 있고,

필요한 경우 새로운 기능이나 속성을 추가할 수도 있다.

부모에게 기본적인 DNA를 물려받았지만, 자식은 살면서 부모와는 다른 경험으로 원하는 직업을 가지며 부모와는 다른 새로운 기술이 있는 것과 같다.

여기서 Dog 클래스는 Animal 클래스에서 name 속성과 move() 메서드를 DNA 처럼 물려받았다.

Dog 만의 bark() 메서드를 추가로 정의할 수 있었다.

상속의 장점은 코드의 재사용성을 높여주고, 중복된 코드 작성을 줄일 수 있다는 점이라는 걸 코드를 보면 알 수 있다.

하지만 상속은 1개만 받을 수 있다는걸 알고 있어야 한다!


3. 다형성 (Polymorphism)

다형성은 객체 지향 프로그래밍의 꽃이라고 한다.

다형성이라는 이름 그대로 어떤 객체의 속성이나 기능이 상황에 따라 여러 형태를 가질 수 있는 성질을 의미한다고 하는데,

비유할게 뭐가 있나 생각해보니, 그냥 우리 자체인 듯 하다.

한 사람이 애인이 있다면 애인에게는 사랑하는 연인이 될 것이고,

부모에게는 자식이 될 것이고, 회사에서는 회사원이 될 것이다.

이런 상황이나 환경에 따라 달라지는 것과 다형성은 매우 비슷하다.

하나의 메서드나 인터페이스가 여러 형태로 사용될 수 있는 능력을 의미하는 것.

쉽게 말하면 같은 이름의 메서드가 다양한 클래스에서 다르게 동작할 수 있도록 해주는 기능이다.

다형성에는 크게 두가지로 나뉜다.

1. 메서드 오버라이딩

위 예시코드를 보면 override 를 이용했는데 override 키워드는 부모 클래스에서 정의한 메서드를 자식 클래스에서 새롭게 재정의할 때 사용되는 키워드다.

이 키워드를 사용하면 "나는 이 메서드를 부모 클래스에서 정의된 것과 다르게 구현할 거야"라고 명시적으로 알려주는 것인 셈이라는 것.

2. 메서드 오버로딩

여기서 add 라는 메서드는 매개변수의 타입에 따라 정수, 실수, 또는 정수와 실수의 덧셈을 처리하는 서로 다른 버전으로 정의되어 있다.

같은 메서드 이름을 사용하면서도 다양한 방식으로 활용할 수 있으니 코드의 가독성을 높이는 데 도움을 주는데,

정리하자면 메서드 오버로딩은 메서드 이름이 같지만,

매개변수의 타입이나 개수가 다를 때 사용되는 다형성의 한 형태라고 볼 수 있다.

다시 돌아가

객체지향 프로그래밍은 객체 간 관계와 협력을 설계하는 건데,

그 중 다형성은 그 관계를 유연하고 확장이 용이한 설계가 가능하도록 하는 핵심적인 역할을 한다는 사실만 알고 있으면 된다.

다형성을 제대로 활용하기 위해선 앞서 말한 추상화와 상속에 대한 내용들도 함께 존재해야하는 사실도 기억하고 있자.


4. 캡슐화 (Encapsulation)

캡슐화는 객체지향 프로그래밍의 핵심 개념 중 하나이다.

보통 "객체지향이 뭔가요?" 라고 물어보면 머릿속에 캡슐화가 떠오르지 않나. 난 그랬다.

"캐.. 캡슐화요!!" 하지만 캡슐화가 정확히 뭔지는 알고 이야기해야 한다.

캡슐화는 말 그대로 하나의 캡슐처럼 객체의 속성과 메서드를 하나의 단위로 묶고,

외부에서 직접 접근할 수 없도록 숨기는 것이다.

이렇게 하면 객체 내부의 데이터 보호도 되고, 코드의 안전성 또한 높여줄 수 있다.

그림에서도 보이듯 캡슐화에서 사용되는 접근 제어자는 주로

private, public , internal , fileprivate , open 같은 키워드다.

각 접근 제어자는 용도에 맞게 사용해서 필요한 데이터만 외부에 노출하고 나머지는 숨길 수 있도록 도와준다.

여기서 다형성에서는 override 를 썼던게 기억나지 않나.

둘의 차이를 함께 이해하면 좋다

  • 캡슐화는 데이터 보호와 내부 구조를 숨기는 것에 초점을 두고, 접근 제어자를 사용해서 데이터에 대한 접근 권한을 설정한다.

  • 다형성은 같은 이름의 메서드가 다양한 방식으로 동작할 수 있도록 해주는 것이라 주로 메서드 오버로딩이나 오버라이딩을 통해 이루어진다.

마지막으로 최최최종 캡슐화 이해를 하고자 코드를 짜봤다.

보면 print(말해줘.비밀) 은 오류가 발생한다.

secretprivate 로 설정되어있으니 클래스 외부에서 직접 접근할 수 없기 때문.

print(말해줘.비밀) 을 주석처리 하고 print(말해줘.비밀접근가능()) 으로 하게 되면 비밀의 값이 반환되어 정상적으로 이건 비밀이야 가 나온다.

이제 캡슐화에 대해 감이 온다.


음...

오늘은 객체지향 프로그래밍(OOP)의 기본 개념에 대해 공부하였다.

나는 객체지향에서 객체가 그저 작은 단위이고 이게 모여 클래스가 되는 줄 알았는데 완전 처음부터 잘못 알고 있었다.

공부를 하며 알게된 건, OOP는 코드의 구조를 효율적으로 만들고, 재사용성도 높여주고,

유지보수를 용이하게 하기 위한 프로그래밍 패러다임이라는 걸 알았다.

주요 개념으로는 객체, 클래스, 캡슐화, 상속, 다형성, 추상화가 있었고, 잘 기억하려 한다.

객체지향 프로그래밍은 복잡한 문제를 보다 간단하게 해결할 수 있도록 도와주는 강력한 도구라는 걸 알게 됐으니

이걸 어떻게 이용하느냐에 따라 앞으로 짜는 코드의 퀄리티가 달라질 것 같다.

잘 생각하고 계속 계속 기억속에서 끄집어내 사용하려고 해야겠다.

profile
iOS 좋아. swift 좋아.

8개의 댓글

comment-user-thumbnail
2024년 10월 31일

ㅋㅋㅋㅋㅋㅋㅋㅋ예시 코드가 넘 귀여운데요

1개의 답글
comment-user-thumbnail
2024년 10월 31일

캡슐화를 통해서 데이터 변경에 안정장치를 거는 방법에는 무엇이 있을까요?

2개의 답글
comment-user-thumbnail
2024년 11월 1일

추상화 : 갖다 쓰는 것
상속 : 물려 받고, 확장하는 것
다형성 : 새로 정의하는 것
캡슐화 : private 쓰는 것
덕분에 이해 완료했습니다😄

1개의 답글