#어려운 용어 개념정리
클래스(class) :객체를 만들기 위한 틀이다. 틀로 찍어낼객체의 속성과 메서드의 집합이 담겨 있다.
객체(object) : 클래스로부터 만들어지는 실체, 클래스로 선언된 변수이다.
인스턴스(instance) : 객체가 메모리에 할당된 상태,객체와 같은 의미로 쓰이기도 한다.
- 3강 객체지향 프로그래밍의 기초
객체지향 프로그래밍(Object Oriented Programming (OOP))
모든것이 클래스 형태이므로 객체화(모듈/캡슐화) 할수 있음- 객체지향의 4가지 특징 키워드
추상화(Abstration): 공통성과 본질을 모아 추출 = 객체의 공통적인 속성(변수)과 기능(메소드)을 추출하여 정의하는것
- 추상화를 구현할 수 있는 문법 요소 : 추상 클래스(abstract class)와 인터페이스(interface)
// 자동차와 오토바이의 공통적인 기능 추출하여 이동 수단 인터페이스에 정의 interface Vehicle { abstract fun start() fun moveForward() fun moveBackward() } // Car 클래스 : 이동수단을 구체화한 자동차 클래스 class Car : Vehicle { override fun moveForward() { println("자동차가 앞으로 전진한다") } override fun moveBackward() { println("자동차가 뒤로 후진한다") } } // MotorBike 클래스 class MotorBike : Vehicle { override fun moveForward() { println("오토바이가 앞으로 전진한다") } override fun moveBackward() { println("오토바이가 뒤로 후진한다") } }
캡슐화: 클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것
데이터 보호 : 외부로부터 클래스에 정의된 속성과 기능들을 보호
데이터 은닉 : 내부의 동작을 감추고 외부에는 필요한 부분만 노출
- 접근제어자(access modifiers)
- 클래스 또는 클래스 내부의 멤버들에 사용되어 해당 클래나 멤버들을 외부에서 접근하지 못하도록 접근을 제한하는 역할
변경자 클래스 멤버 최상위 선언 public(기본 가시성임) 모든 곳에서 볼 수 있다. 모든 곳에서 볼 수 있다. internal 같은 모듈 안에서만 볼 수 있다. 같은 모듈 안에서만 볼 수 있다. protected 하위 클래스 안에서만 볼 수 있다. (최상위 선언에 적용할 수 없음) private 하위 클래스 안에서만 볼 수 있다. 같은 파일 안에서만 볼 수 있다. - 필드와 메서드를 하나의 단위로 묶어서 외부에서 직접적인 접근을 제한하고 데이터를 보호하기 위한 것으로, 필요한 경우에만 메서드를 통해 데이터를 조작할 수 있다.
- 정보 은닉화 : 객체의 외부와 내부를 구분하고, 외부로부터의 접근을 제어하여 객체를 안정적으로 사용하고 관리할 수 있도록 도와준다.
상속:
- 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것
클래스 간 공유될 수 있는 속성과 기능들을 상위 클래스로 추상화시켜 해당 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 한다.- 클래스들 간 공유하는 속성과 기능들을 반복적으로 정의할 필요 없이 딱 한번만 정의해두고 간편하게 재사용할 수 있어 반복적인 코드를 최소화하고 공유하는 속성과 기능에 간편하게 접근하여 사용할 수 있도록 한다.
상속과 인터페이스 비교- 공통점 : 양자 모두 상위 클래스-하위 클래스의 관계를 전제하면서 공통적인 속성과 기능을 공유할 수 있다.
- 차이점 : 상속의 경우 상위 클래스의 속성과 기능들을 하위 클래스에서 그대로 받아 사용하거나 오버라이딩을 통해 선택적으로 재정의하여 사용할 수 있는 반면, 인터페이스를 통한 구현은 반드시 인터페이스에 정의된 추상 메서드의 내용이 하위 클래스에서 정의되어야 한다.
- 결론 : 상속 관계의 경우 인터페이스를 사용하는 구현에 비해 추상화의 정도가 낮다고 할 수 있다.
인터페이스가 역할에 해당하는 껍데기만 정의해두고, 하위 클래스에서 구체적인 구현을 하도록 갖에하는 것에 비해, 상속 관계의 경우 상황에 따라 모든 구체적인 내용들을 정의해두고 하위 클래스에서는 그것을 단순히 가져다가 재사용할 수 있다.
다형성:하나의 인터페이스나 부모 클래스를 통해 여러 구현 클래스나 자식 클래스를 다룰 수 있는 기능으로, 같은 메서드 호출을 통해 서로 다른 클래스의 메서드를 실행할 수 있다.
메서드 오버라이딩과 메서드 오버로딩을 통해 구현한다.
- 메서드 오버라이딩을 통해 같은 이름의 moveForward()와 moveBackward()를 각각의 클래스의 맥락에 맞게 재정의하여 사용할 수 있다.
즉, 같은 이름의 메서드가 상황에 따라 다른 역할을 수행하는 것- 메서드 오버로딩 : 하나의 클래스 내에서 같은 이름의 메서드를 여러 개 중복하여 정의하는 것
- 어머니 아프신 것에 신경 쓰여 빡 집중은 못했지만 "티끌"집중 모아 태산....아니 언덕 수준 된 듯