[DEV] study&learn
article thumbnail

절차지향과 객체지향

객체 지향

객체 지향 모델링은 기능이 아닌 객체가 중심이 되며 "누가 어떤 일을 할 것인가?"가 핵심이 된다.

즉, 객체를 도출하고 각각의 역할을 정의해 나가는 것에 초점을 맞춘다.

 

객체 지향 프로그래밍의 특징

  1. 추상화(abstraction)
    • 객체들의 공통적인 특징(기능, 속성)을 도출하는 것
    • 객체지향적 관점에서는 클래스를 정의 하는 것을 추상화라고 할 수 있다.
  2. 캡슐화(encapsulation)
    • 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.
    • 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것
    • 데이터를 보이지 않고 외부와 상호작용을 할 때는 메소드를 이용하여 통신을 한다. 보통 라이브러리로 만들어서 업그레이드해 사용할 수 있다.
  3. 상속성(inheritance)
    • 하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것
    • 이미 작성된 클래스를 받아 새로운 클래스를 생성하는 것
    • 기존 코드를 재활용해 사용함으로써 객체 지향 방법 중 중요한 기능 중 하나에 속한다.
  4. 다형성(polymorphism)
    • 약간 다른 방법으로 동작하는 함수를 동일한 이름으로 호출하는 것
    • 동일한 명령의 해석을 연결된 객체에 의존하는 것
    • 오버 라이딩(Overriding) : 부모클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의하는 것
    • 오버 로딩(Overloading) : 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하여 사용하는 것
  5. 동적바인딩(Dynamic Binding)
    • 가상 함수를 호출하는 코드를 컴파일할 때, 바인딩을 실행시간에 결정하는 것
    • 파생 클래스의 객체에 대해, 기본 클래스의 포인터로 가상 함수로 호출될 때 일어난다.
    • 함수를 호출하면 동적 바인딩을 통해 파생 클래스에 오버 라이딩된 함수가 실행된다.
    • 프로그래밍의 유연성을 높여주며 파생 클래스에서 재정의한 함수의 호출을 보장(다형 개념 실현)한다.

 

객체 지향의 3요소

캡슐화(Encapsulation) - 은닉성

객체의 속성(Varialble)을 보호하기 위해 사용

  • 예) 컴퓨터 전원을 켜기 위해 메인보드에 전기 신호를 직접 주는 것이 아닌 외부 케이스의 전원 버튼을 이용함

이렇게 캡슐이 필요한 위치에서 정확히 작용하게 해야 하고, 이것을 객체지향에서 캡슐화라고 한다.

자바에서의 캡슐화란 값의 보호를 위해서 필드, 메소드를 필요에 의해 감추거나 들어내는 것을 말한다.

필드와 메소드를 보호하는 이유는 외부로부터의 잘못된 접근으로 인해 객체의 데이터나 메소드에 유효하지 않은 값이 들어가 시스템 전체에 영향을 끼치는 것을 미연에 방지하기 위함이다.

 

필드와 메소드의 접근은 자바에서 정의하는 접근 제한자를 사용한다.

캡슐화의 특징

  • 데이터(필드)는 가리고
  • 데이터 접근을 위해 getter/setter 메소드를 호출
  • 메소드 호출 시 유효성 검사가 필요하다면 메소드를 추가

 

상속(inheritance)

상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.

상속을 통해서 클래스를 작성하면, 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다. (코드의 재사용성을 높이고 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여)

 

자바에서의 상속 예시

사진1
사진2

  • 상속을 구현하는 방법은 (사진2) 처럼 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 함께 써 주기만 하면 된다.
  • 고등학생과 대학생은 '학생'이라는 공통분모이기 때문에 학생이 가지고 있는 데이터 name, age와 메소드 study()를 가져야 한다.
    여기서 고등학생과 대학생 클래스에서 name, age, study()를 중복으로 설계하는 것은 비효율적일 것이다.

 

  • 각 클래스는 Student를 상속받아 학생들이 가져야 할 정보(name, age)와 study()를 사용할 수 있다.
  • 여기서 고등학생은 특성에 맞게, 학번과 계열(이/문)을 데이터로 선언하고, yaza()라는 메소드를 선언하였다.
  • 마찬가지로 대학생도 특성에 맞게 학번과 전공이라는 데이터를 선언하고, drink() 메소드를 선언하였다.

 

  • 상속한 클래스의 모든 데이터와 메소드를 사용할 수 있는 것은 아니다. 모든 데이터는 접근제한자에 의해 관리된다.

 

  • 추상화
    • 어떤 실체로부터 공통적인 부분이나 관심 있는 특성들만 한 곳에 모은 것은 의미.
    • 객체 지향에서의 추상화는 어떤 하위클래스들에 존재하는 공통적인 속성/기능을 인터페이스로 정의하는 것이다.

 

  • 마지막으로 부모 클래스에서 정의된 메소드의 작업이 자식클래스에서 다른 행위로 Override 될 수 있는 것을 객체지향의 다형성이라고 한다.

 

다형성(Polymorphism)

프로그램 언어의 다형성은 그 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로,

프로그램 언어의 각 요소들(상수, 변수, 식, 오브젝트, 함수, 메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다.

(반대로 단형성은 프로그램 언어의 각 요소가 한가지 형태만 가지는 성질)

 

쉽게 말해, 다형성이란 하나의 객체에 여러 가지 타입을 대입할 수 있다는 것을 의미한다.

(반대로 단형성은 하나의 객체에 하나의 타입만 대응)

 

 ✏️ 정리하자면 다형성이란 동일한 타입을 가진 여러 객체가 같은 속성을 가지는 성질이라고 생각해도 무방할 것 같다.

profile

[DEV] study&learn

@devjuni

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!