독립된 단위인 객체를 기준으로 코드를 나누고 그 객체들 간의 유기적인 상호작용을 목표로 구현하는 프로그래밍 기법이다.
이를 쉽게 말하면, 부품 객체를 만들고 이들을 하나씩 조립해서 완성된 프로그램을 만드는 기법이다.
코드 재사용성이 좋아진다.
남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있다.
유지보수가 쉬워진다.
절차 지향 프로그래밍의 경우 코드 수정 시 일일이 찾아서 수정해야 하지만 객체 지향 프로그래밍에서는 클래스로 구분되어 있기 때문에 내부의 멤버변수나 메서드를 찾아 수정하기가 쉽다.
대형 프로젝트에 적합하다.
클래스 단위로 모듈화시키기 때문에 여러명이 개발할 경우 업무 분담이 쉬워진다.
세상에 존재하는 모든 것, 프로그램 단위
ex) 사람, 자전거, tv - 사칙연산 프로그램
객체를 생성하기 위한 틀을 말하며 객체는 클래스로부터 new
를 통해 생성된다.
Memo myMemo = new Memo();
이 때 클래스로부터 생성된 객체를 인스턴스라고 부른다.
그렇다면 객체와 인스턴스의 차이점은 무엇일까?
인스턴스라는 말은 특정 객체가 어떤 클래스의 객체인지를 관계위주로 설명할 때 사용된다. Animal
클래스에 의해 cat
이라는 객체가 생성되었을 때, 1. cat은 Animal의 인스턴스 2. cat은 객체
이렇게 말할 수 있다.
클래스는 멤버 변수, 메서드, 생성자로 구성된다.
클래스 이름의 첫 글자는 일반적으로 대문자로 짓는다.
생성자는 클래스에서 객체를 생성할 때 가장 먼저 호출되며 클래스와 이름이 같다.
= 공통점 모델링
가장 상위 개념. 가장 특징적인 속성을 파악해가기.
하위 개념들에게 공통적으로 적용할 수 있는 속성.
구체적이지 않은 필요성에 의한 공통적인 특성만 가지고 구성하는 것. 특징만 나열하고 이를 통해 구체화한 객체를 생성한다.
= 정보 은닉.
내부 동작이 어떻게 돌아가는지 모르더라도 사용법만 알면 쓸 수 있도록 클래스 내부 감추기.
관련된 기능과 특성을 한 곳에 모으고 분류하여 재활용을 쉽게 한다. 기능과 특성의 모음을 클래스라는 캡슐에 분류해서 넣는다. 외부에서 객체의 내부데이터로 직접 접근하지 못하게 통제하여 정보를 은닉한다. 은닉된 정보로의 접근은 접근지정자를 통해서만 조작할 수 있다.
private
: 본인 클래스 내부의 메서드만 접근 가능protected
: 본인 클래스, 상속받은 자식 클래스에서 접근 가능public
: 모든 접근 허용 = 재사용, 확장
부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하고 상속받은 자식클래스에서 일부분을 수정하여 사용할 수 있다. extends
를 통해 클래스 상속을 한다.
상속을 통해 기존의 검증된 class를 이용해서 빠르고 쉽게 새로운 class를 만들 수 있다. 부모님의 식당의 비법을 계승하여 식당을 차리게 되는 것으로 예를 들 수 있다. 여기서 더 맛있게 업그레이드 하는 것->오버라이딩
자식 클래스는 부모 클래스의 private
접근자의 속성과 메서드를 제외한 모든 자원을 사용할 수 있다.
= 사용 편의
다양한 형태를 가지고 있음. 변수명이나 함수명이 상황에 따라 다르게 해석될 수 있음.
메소드는 같지만 내부 구현이 다르기 때문에 다양한 형태의 결과 나올 수 있음(ex.출력되는 값)
-> 추상 클래스, 인터페이스, 오버로딩
즉 하나의 객체가 여러 가지 형태를 가질 수 있는 것을 의미한다. 오버라이딩, 오버로딩이 가능하다.
메서드 오버로딩, 생성자 오버로딩.
같은 이름의 함수를 여러개 정의하고 매개변수의 타입과 개수를 다르게.
-> 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있고, 메소드의 이름을 절약할 수 있다.
부모클래스를 상속받아 사용하며 자식 클래스에서 재정의가 가능하다. 재정의하는 것이므로 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값이 모두 같아야한다.
reference
참고 | 자바 프로그래밍 입문 강좌 (renew ver.)
참고 | 객체 지향 프로그래밍이 뭔가요?
참고 | OOP란?