참고 영상
객체지향에 대해 완벽히 정리가 되지 않은 것 같아 따로 영상을 보고 정리해보려한다.
OOP : Object-Oriented Programming. 객체지향프로그래밍. 객체들이 모여서 상호협력하면서 데이터를 처리하는 방식의 프로그래밍 설계방법.
Class(클래스) : 객체를 위한 팩토리. 동일한 속성을 갖고 있지만 데이터는 다른 경우.
클래스는 일종의 구조, 설계도, 템플릿, 금형, 붕어빵틀.
Instance(인스턴스) : 클래스로 만들어낸 객체.
Method(메서드) : 클래스 내에 있는 함수. 인수를 받아 클래스를 어떻게 구성할지 정한다.
상속(Inheritance) : 자식(child)클래스가 부모(parent)클래스의 속성을 갖게 된다.
상위 개념의 특징을 하위 개념이 전부 물려받는 것.
부모클래스에서 공통의 속성을 정의하고 자식클래스에서 각각 자신만의 속성을 정의하면 코드 중복이 줄어든다.
상속을 통해 코드 중복을 줄이고 코드를 재사용 가능한 조각으로 나눌 수 있다.
상속은 분할과 정복을 가능하게한다. 클래스들을 작게 분할한 후에 레고처럼 클래스들을 구성할 수 있다.
캡슐화(Encapsulation): 데이터, 데이터를 활용하는 함수를 클래스라는 캡슐 안에 묶는 것. 코드가 더 구조화된다. 즉, 변수와 함수를 클래스에 하나로 묶는 것. 그래서 원하면 데이터와 코드를 캡슐 외부에서 알 수 없게 할 수 있다.
클래스 안에 있는 데이터를 이용하는 메서드일경우 캡슐 에 넣으면 데이터에 직접 엑세스 시켜 인수를 취할 필요가 없다.
캡슐화를 통해 표시할 속성과 숨길 속성을 선택할 수 있다. 내부적으로만 사용되는 것을 외부로 노출시키지 않고 감추기 위해 사용. 접근제어자로 클래스 정보에 접근 or 수정할 권한을 결정한다.
추상화(Absrtaction) : 구현 세부 정보를 숨기는 일반 인터페이스를 지정하는 행위. 속성이나 기능을 묶어 이름을 붙이는 것. 객체의 여러 특성중 필요한(공통적인)부분만 추출해서 개략화.
클래스를 정의할 때 불필요한 부분들을 생략하고 객체의 속성 중 중요한 것에만 중점을 두고 개략화하는 것.
제어 추상화 : 어떤 클래스의 메소드를 사용하는 사용자에게 해당 메소드의 작동방식과 같은 내부 로직을 숨기는 것. 프로그래밍의 복잡성을 줄여주고 가독성과 생산성을 높여준다.
데이터 추상화 : 대상을 간단한 개념으로 일반화하는 과정. 공통의 특징으로 묶어서 이름을 붙여 디테일을 없에고 공통의 특징만 남긴다. 하위개념에서 공통 특징을 모아 상위개념을 만드는 것.
Polymorphism : Poly-여러 / morphism-형태, 모양. 상속과 연관된 개념으로 하나의 객체가 다른 여러 객체로 재구성되는 것. 한 부모클래스에서 나왔다고 같은 자손객체가 아니다. 오버라이딩 오버로딩이 다형성을 드러내는 대표적인 예.
오버라이딩(Overriding) : 자식클래스가 부모클래스의 모든 특성을 상속받지만 특정 메서드는 다르게 구현할 수 있다.
부모클래스에서 메서드를 오버라이딩할 수 있지만, 마음대로 다 바꾸는 것이 아니라 메서드가 어떻게 작동해야하는지 규칙이 정해져 있다.(java의 경우 부모 클래스의 메소드와 이름, 매개변수, 반환타입이 같아야 한다.)
그 결과, 클래스의 핵심은 그대로 있고 구현방식의 모양과 모습만 달라지는데 이를 다형성이라 한다.
조상타입의 참조변수로 자손타입의 객체를 다룰 수 있는데, 이 경우 조상타입엔 없고 자손타입에만 있는 기능 및 속성은 사용할 수 없다.
class People {
public void walking() {
System.out.println("사람은 걷는다.")
}
}
class Army {
@Override
public void walking() {
System.out.println("군인은 걷지않고 뛴다.")
}
public void shooting() {
System.out.println("군인은 총을 쏜다.")
}
}
class Test {
public static void main(String[] args){
// 조상타입인 People의 참조변수로 자손타입인 Army의 객체를 다룰 수 있다.
People ChoonB = new Army();
ChoonB.walking(); // "군인은 걷지않고 뛴다." 오버라이딩된 자손타입의 메소드 출력
// ChoonB.shooting(); // 에러발생으로 실행 불가.
// 조상타입엔 없고 자손타입에만 있는 메서드라 위의 선언으로는 불가능.