클래스와 객체1
이유빈 |
객체지향 프로그래밍
- 객체를 사용하는 프로그래밍 방식
- 실세계와 비슷하게 소프트웨어를 작성하자는 방법론
- 객체들은 객체 나름대로의 고유한 기능을 수행하며 다른 객체들과 상호작용
- 객체들은 메시지를 통하여 상호작용함
- 데이터와 함수를 하나로 묶어서 생각하는 방법
- 객체지향 언어는 캡슐화, 상속, 다형성, 추상화로 정의됨
객체
- 객체는 상태와 동작을 가지고 있음
- 객체의 상태(state)는 객체의 속성임
- 객체의 동작(behavior)은 객체가 취할 수 있는 동작임
절차지향 프로그래밍
- 절차 지향 프로그래밍은 프로지서(procedure)에 기반을 둠
- “절차”라는 용어는 “procedure”를 번역한 것이며, 프로시저는 함수 또는 서브 루틴을 뜻함
- 절차지향 프로그래밍 → 함수들의 집합으로 이루어짐
- 문제점
- 서로 관련있는 함수와 데이터가 분리됨
- 예) 원의 반지름을 나타내는 radius와 이 데이터를 사용하는 함수 getCircleArea()가 분리됨
객체지향이 나오게 된 동기
- 컴퓨터 소프트웨어를 하드웨어처럼 원하는 함수를 조립해 만들수 없을까?
- 코드와 데이터를 묶을 수 있는 방법이 없을까?
캡슐화
- 데이터와 함수(객체) 또는 데이터와 알고리즘으로 묶는 것을 캡슐화라고 함
- 캡슐화의 목적
- 서로 관련된 데이터와 알고리즘을 하나로 묶는 것
- 객체를 캡슐로 싸서 객체의 내부를 보호하는 것 즉, 객체의 실제 구현 내용을 외부에 감추는 것
- 소프트웨어 캡슐
- 클래스 = 캡슐화 = 메소드+변수
- 공개인터페이스 = 공개 매서드
정보은닉
- 객체의 외부에서는 객체의 내부 데이터를 볼 수 없게 한다는 것
- 객체 안의 데이터와 알고리즘은 외부에서 변경하지 못하게 막고, 공개된 인터페이스를 통해서만 객체에 접근하도록 하는 개념
상속
- 이미 작성된 클래스(부모 클래스)를 이어받아 새로운 클래스(자식 클래스)를 생성하는 것
- 자식 클래스는 부모 클래스의 속성과 동작을 물려 받음
다형성
- 동일한 이름의 동작이라고 하여도 객체의 실제 타입에 따라서 동작의 내용이 달라질 수 있음
추상화
- 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 기법
클래스
- 객체에 대한 설계도
- 특정한 종류의 객체들을 찍어내는 형틀 또는 청사진이라고도 할 수 있다.
- 클래스로부터 만들어지는 각각의 객체를 그 클래스의 인스턴스라고 함
- 하나의 클래스로 여러개의 인스턴스를 찍어내지만, 인스턴스마다 속성의 값은 다름(다형성)
public class 클래스이름 {
자료형 필드1;
...
반환형 메소드1() {...}
...
}
객체생성
-
참조 변수를 선언
Circle obj; -
new 연산자를 사용하여서 객체를 생성하고 객체의 참조값을 참조 변수에 저장
obj = new Circle(); -
객체의 필드와 메소드를 사용
참조변수
- 참조 변수는 객체를 참조할 때 사용되는 변수로서 여기에는 객체의 참조값이 저장됨
- 참조값은 일반적으로 객체의 주소임
메소드 오버로딩
- 같은 이름의 메소드가 여러 개 존재하는 것. “중복정의”라고도 함.
-
메소드의 반환형만 다르다고 중복정의할 수는 없음. 반드시 메소드 매개변수가 달라야함.
int add(int x, int y) {...} double add(int x, int y) {...} //불가능
생성자
- 객체가 생성될 때 객체를 초기화하는 특수한 메소드
- 기본 생성자
- 매개 변수가 없는 생성자
- 개발자가 생성자를 하나도 정의하지 않으면 자바 컴파일러는 기본 생성자를 자동으로 만듦
- 다른 생성자가 존재할 때는 기본 생성자가 추가되지 않음
this 참조 변수
- 현재 객체 자신을 가리키는 참조 변수
- 컴파일러에서 자동으로 생성함
- 생성자에서 매개 변수 이름과 필드 이름이 동일한 경우에 혼동을 막기 위해 사용
접근제어
- 클래스의 멤버에 접근하는 것을 제어하는 것
- private - 클래스 안에서만 접근 가능
- public - 누구나 접근 가능
- protected - 자식 클래스만 접근 가능
- 접근 지정자가 없는 경우
- default라고 불리며 동일한 패키지 안에서만 접근 가능
접근자와 설정자
- 필드값을 반환하는 접근자(getters), 필드값을 성정하는 설정자(setters)
- 이러한 메소드는 대개 get이나 set이 메소드 이름 앞에 붙여짐
- 예) getBalance(), setBalance()
- 사용하는 이유
- 접근자와 설정자를 사용해야만 나중에 클래스를 업그레이드할 때 편함
- 접근자에게 매개 변수를 통하여 잘못된 값이 넘어오는 경우, 이를 사전에 차단할 수 있음
- 필요할 때마다 필드값을 동적으로 계산하여 반환할 수 있음
- 접근자만을 제공하면 자동적으로 읽기만 가능한 필드를 만들 수 있음
댓글