본문 바로가기
야미스터디/Backend

OOP (객체지향 프로그래밍)

by 의정부핵꿀밤 2021. 9. 9.
728x90

UMC 면접이 있었는데 거기 조건에 객체지향 정도만 알면 된다고 하길래 면접때 물어보려나? 하고 정리한 OOP 개념...

근데 진짜 휴먼 면접이었다.. 기술면접일줄...ㅋㅋㅋㅋㅋ

그래도 정리한거 아까워서 블로그에 기록해두려고!

결과 일요일에 나온다는데 됐으면 좋겠다!!! 나도 앱 한번 만들어보자!!!

모야 쓰고나니까 긴장되네 붙을거야 나정도면!!! 얼른 정리하자


[ OOP란? ]

  • Object Oriented Programming
  • 실제 세계의 사물들을 객체로 모델링하여 개발을 진행하는 프로그래밍
  • 대표적으로 Java, C++ 등이 있다

 

[ OOP 장점 ]

  • 코드 재사용 용이 : 다른 사람이 만들어둔 클래스를 가져와서 이용할 수 있고, 상속을 통해 확장해서 사용이 가능하다.
  • 유지보수가 쉽다 : 수정할 코드를 일일이 찾아서 수정해야하는 절차지향과 달리, 수정할 부분이 클래스 내부에 멤버 변수 확인 메서드로 있기 때문에 해당 부분만 수정하면 된다.
  • 대형 프로젝트에 적합 : 클래스 단위로 모듈화시켜 개발이 가능하기 때문에, 대형 개발 및 업무 분담이 가능하다.

 

[ OOP 단점 ]

  • 처리속도가 상대적으로 느리다
  • 객체가 많으면 용량이 커질 수 있다
  • 설계 시 많은 시간과 노력이 필요하다

 

[ 절차지향 vs 객체지향 ]

 

절차지향 프로그래밍

  • 순차적인 처리
  • C언어가 대표적이다
  • 컴퓨터의 처리구조와 유사하기 때문에 처리 속도가 빠르다
  • 코드의 순서가 바뀌면 동일한 결과가 보장되지 않는다

 

객체지향 프로그래밍

  • 실제 세계의 사물들을 객체로 모델링하여 개발을 진행하는 프로그래밍이다
  • Java, C++이 대표적이다
  • 캡슐화, 상속, 다형성, 추상화 등이 있다
  • 절차지향보단 속도가 느리다

 

[ OOP의 5가지 설계 원칙 ]

  • SRP(Single Responsibility Principle, 단일 책임 원칙): 클래스는 단 하나의 목적을 가져야 하며, 클래스를 변경하는 이유는 단 하나의 이유여야 한다.
  • OCP(Open-Closed Principle, 개방 폐쇠 원칙): 클래스는 확장에는 열려 있고, 변경에는 닫혀 있어야 한다.
  • LSP(Liskov Substitution Principle, 리스코프 치환 원칙): 상위 타입의 객체를 하위 타입으로 바꾸어도 프로그램은 일관되게 동작해야 한다.
  • ISP(Interface Segregation Principle, 인터페이스 분리 원칙): 클라이언트는 이용하지 않는 메소드에 의존하지 않도록 인터페이스를 분리해야 한다.
  • DIP(Dependency Inversion Principle, 의존 역전 법칙): 클라이언트는 추상화(인터페이스)에 의존해야 하며, 구체화(구현된 클래스)에 의존해선 안된다.

 

[ OOP의 5가지 키워드 ]

  1. 클래스 + 인스턴스 (객체)
  2. 추상화
  3. 캡슐화
  4. 상속
  5. 다형성

 

[ 클래스 / 인스턴스 (객체) ]

 

클래스

  • 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐, 집단에 속하는 속성과 행위를 변수와 메서드로 정의한 것
  • 객체를 찍어내는 틀이라고 생각하면 된다

 

인스턴스 (객체)

  • 클래스에서 정의한 것을 토대로 실제 메모리 상에 할당된 것으로, 실제 프로그램에서 사용되는 데이터

 

[ 추상화 ]

  • 불필요한 정보는 숨기고 (정보은닉), 중요한 정보만을 표현함으로써 공통의 속성이나 기능을 묵어 이름을 붙이는 것이다
  • 즉, 공통적인 요소나 특징을 추출하는 과정이다
  • 추상 클래스 : 클래스의 특징을 뽑아내서 실체가 없는 개념으로 다루게 하는것! (추상클래스와 인터페이스는 따로 정리할 것이다!)

 

[ 캡슐화 ]

  • 하나의 객체에 대해 그 객체가 특정한 목적을 위해 필요한 변수나 메소드를 하나로 묶는 것이다
  • 기능과 특성의 모음은 "클래스"라는 "캡슐"에 분류해서 넣는 것이다
  • 객체가 맡은 역할을 수행하기 위해 하나의 목적을 한 곳에 묶는 것이다
  • 이를 통한 정보 은닉도 가능하다 -> 데이터를 private으로 선언하고, 이에 접근하기 위한 메서드를 public으로 선언하여 이용한다 (getter, setter)

 

* getter, setter를 사용하는 이유

- 멤버 변수에 접근하지 못하게 접근 지정자를 private으로 설정하고, public으로 getter, setter 메서드를 만드는 이유는?

=> 메서드를 통해 접근 시, 메서드 내에서 매개변수 등과 같은 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한하거나 조절이 가능하기 때문이다

 

 

 

[ 상속 ]

  • 객체 지향의 꽃이다🌸
  • 기존의 상위클래스에 근거하여 새롭게 클래스와 메소드를 정의할 수 있다
  • 기존 클래스의 기능을 가져와서 재사용이 가능하고, 새롭게 만든 클래스에 기능 추가도 가능하다
  • Java에선 단일 상속만 가능하고, C++은 다중 상속을 허용한다
  • Java에서 다중 상속이 안되는 불편함을 해소하기 위해 Interface를 통해 다중 상속이 구현이 가능하다

 

* 추상 클래스 vs 인터페이스

- 추상클래스 : 클래스의 멤버함수의 Body를 정의가 가능하다

- 인터페이스 : 모두 몸체가 없는 껍데기만 정의가 가능하다

- 공통점 : 둘 다 instance화가 불가능하여 객체 생성이 불가능하다

(일단은 간단하게만 이정도만...ㅎㅎ)

 

 

[ 다형성 ] 

  • 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것이다
  • 즉, 같은 행위를 하지만 목적과 용도에 맞게 다양한 기능 수행과 처리, 결과를 낳을 수 있다
  • 상속을 통해 기능을 확장하거나 변겨잉 가능하도록 한다
  • 코드의 재사용이 가능하고 전체 코드의 길이가 감소한다 -> 유지보수가 용이해진다

 

* 오버라이딩

- 자식 클래스에서 상속받은 부모클래스의 만들어진 메서드를 같은 이름과 매개변수로 재정의 하는 것이다

- 이름과 매개변수가 같다

- Java에서 지원한다

 

 

* 오버로딩

- 하나의 클래스안에서 같은 메서드를 쓰지만, 각 메서드마다 다르게 사용되며 결과물도 다르다

- 메서드끼리 이름은 같지만 매개변수 개수나 데이터 타입이 다르다

- 즉, 같은 이름의 함수를 여러개 정의하고 매개 변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것이다

- 주로 C++에서 지원한다

 

 

 


끝!

일단 OOP 정리한건 끝났고, 이거 정리하다 기술면접 정리한 블로그가 있길래 그것들 꾸준히 정리해보려고!

우선 다음으로 정리할 것은 추상클래스랑 인터페이스 차이다!!!

728x90

댓글