https://sundaland.tistory.com/297
객체는 객체 지향 기술을 이해하는 핵심이다.
현실세계의 객체는 모두 상태(State)와 행동(Behavior)를 가지고 있으며, 개는 상태(이름, 품종)을 가지고 있고 행동(짖기, 꼬리 흔들기)등을 한다.
현실 세계 객체의 상태와 행동을 식별하는 것은 객체 지향 프로그래밍 관점에서 사고하기 시작하는 좋은방법이다.
객체는 상태를 필드(변수)에 저장하고 메서드(함수)를 통해 행동을 외부로 노출한다. 메서드는 객체의 내부 상태에서 작동하며 객체 간의 주요 통신 매커니즘으로 작용한다.
내부 상태를 숨기고 모든 상호작용을 객체의 메서드를 통해 수행하도록 요구하는 것을 캡슐화라고 한다.
코드를 개별 소프트웨어 객체에 묶는 것은 여러가지 이점을 제공한다, 이점에는 다음이 포함된다.
- 모듈화 : 객체의 소스 코드는 다른 객체의 소스 코드와 독립적으로 작성 및 유지 관리될 수 있다.
- 정보 은닉 : 내부 구현의 세부 사항이 외부 세계에 숨겨질 수 있다.
- 코드 재사용 : 이미 존재하는 객체를 프로그램에서 사용할 수 있다. 특정 작업에 특화된 객체 구현이 가능하다.
- 플러그 가능성 및 디버깅 용의성 : 특정 객체에서 문제가 발생하면 해당 객체를 제거하고 다른 객체로 대체할 수 있다.
클래스 (Class)
현실세계에서는 동일한 종류의 개별 객체를 많이 찾을 수 있다. 예시로 자신이 소유한 자전거는 자전거로 알려진 객체들의 클래스의 인스턴스(변수)라고 한다.
또한 클래스는 개별 객체가 생성되는 설계도이다.
public class Bicycle {
int cadence = 0;
int speed = 0;
int gear = 1;
void changeCadence(int newValue) {
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear);
}
}
필드인 cadence, speed, gear는 객체의 상태를 나타내며, 메서드인 changeCadence, changeGear, speedUp, applyBrakes는 외부 세계와의 상호작용을 정의한다.
위 코드는 자전거를 사용하는 어플리케이션의 설계도이기 때문에 main 메서드가 포함되어 있지 않다.
아래의 코드는 두 개의 별개 Bicyle 객체를 생성하고 그들의 메서드를 호출하는 클래스이다.
public class BicycleDemo {
public static void main(String[] args) {
Bicycle bike1 = new Bicycle();
Bicycle bike2 = new Bicycle();
bike1.changeCadence(50);
bike1.speedUp(10);
bike1.changeGear(2);
bike1.printStates();
bike2.changeCadence(50);
bike2.speedUp(10);
bike2.changeGear(2);
bike2.changeCadence(40);
bike2.speedUp(10);
bike2.changeGear(3);
bike2.printStates();
}
}
cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3
상속 (Inheritance)
다양한 종류의 객체들은 종종 서로 공통된 부분을 가지고 있다. 예를 들자면 산악 자전거와 로드 자전거는 모두 자전거의 특성을 공유하지만, 각각 그들을 다르게 만드는 추가적인 특징을 정의한다.
객체 지향 프로그램밍에서는 클래스가 다른 클래스에서 일반적으로 사용되는 상태와 행동을 상속받을 수 있다.
예시로 자전거는 산악 자전거, 로드 자전거의 부모 클래스가 된다.
자바 프로그래밍에서는 각 클래스는 하나의 직접적인 부모 클래스를 가질 수 있으며, 각 부모 클래스는 무제한 수의 자식 클래스를 가질 수 있다.
# 부모 클래스 = 슈퍼 클래스, 자식 클래스 = 서브 클래스
클래스 선언 부분에서 상속할 클래스 이름 뒤에 extends 키워드를 사용한다.
class MountainBike extends Bicycle {
}
MountainBike 클래스는 Bicycle 클래스와 동일한 필드와 메서드를 모두 가지게 되며, 이를 통해 공유한 기능에만 집중할 수 있다. 이로 인해 자식 클래스의 코드는 가독성이 좋아진다.
하지만 각 서브 클래스의 소스 파일에 해당 코드가 나타지 않기 때문에 각 부모 클래스가 정의하는 상태와 행동을 올바르게 문서화하는 것이 중요하다.
인터페이스 (Interface)
객체는 자신이 노출하는 메서드를 통해 외부 세계와 상호작용을 정의한다.
메소드는 객체와 외부세계의 인터페이스를 형성한다.
가장 일반적인 형태의 인터페이스는 본문이 없는 인터페이스 이름과 관련된 메서드의 그룹이다.
interface Bicycle {
void changeCadence(int newValue);
void changeGear(int newValue);
void speedUp(int increment);
void applyBrakes(int decrement);
}
클래스 선언에서 implements 키워드로 구현이 가능하다.
class ACMEBicycle implements Bicycle {
int cadence = 0;
int speed = 0;
int gear = 1;
void changeCadence(int newValue) {
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear);
}
}
인터페이스를 구현하면 클래스가 제공하기로 약속한 동작에 대해 보다 공식적으로 정의할 수 있다.
클래스와 외부 세계간의 계약(Contract)을 형성하며, 이 계약은 컴파일러에 의해 빌드 시점에 강제된다.
클래스가 인터페이스를 구현한다고 주장한다면, 그 인테페이스에 정의된 모든 메서드는 클래스가 성공적으로 컴파일되기 전에 소스 코드에 나타나야 한다.
패키지 (Package)
관련 클래스 및 인터페이스의 집합을 구성하는 네임 스페이스이다.
자바 플랫폼은 자신의 애플리케이션에 사용하기 적합한 거대한 클래스 라이브러리(패키지 세트)를 제공한다.
이 라이브러리는 응용 프로그래밍 인터페이스 또는 API로 알려져 있다.
JAVA 플랫폼 API 사양에는 JAVA SE 플랫폼에서 제공하는 모든 패키지, 인터페이스, 클래스, 필드 및 메서드에 대한 전체 목록이 포함되어 있다.
'자바 튜토리얼' 카테고리의 다른 글
클래스와 객체 (Classes and Objects) [2] (0) | 2024.07.03 |
---|---|
클래스와 객체 (Classes and Objects) [1] (0) | 2024.07.02 |
제어 흐름 명령문 (Control Flow Statements) (0) | 2024.07.01 |
표현식(Expressions)과 명령문(Statements), 블록(Block) (0) | 2024.06.28 |
연산자 (Operators) (0) | 2024.06.28 |