프로그래머가 코드를 어떻게 작성해야 할 지 결정하는 역할
프로그래밍 패러다임을 통해 여러 방식으로 코드를 바라보게 되고, 이를 바탕으로 구현하게 된다.
장점
단점
객체(Object) : 객체지향 프로그래밍의 가장 기본적인 단위이자 시작점
- 모든 실재하는 대상
- 우리가 보고 느끼고 인지할 수 있는 모든 것
- 모든 사건은 객체들 간의 상호작용으로 발생한다.
- 속성 / 기능 / 변수 / 함수
// Vehicle 인터페이스
public interface Vehicle {
public abstract void start();
void moveForward(); // public abstract 키워드는 생략이 가능하다.
void moveBackward();
}
// Car 클래스
// 이동 수단을 구체화한 자동차 클래스
public class Car implements Vehicle {
@Override
public void moveForward() {
System.out.println("자동차가 앞으로 전진합니다!");
}
@Override
public void moveBackward() {
System.out.println("자동차가 뒤로 후진합니다!");
}
}
// MotorBike 클래스
public class MotorBike implements Vehicle {
@Override
public void moveForward() {
System.out.println("오토바이가 앞으로 전진합니다!");
}
@Override
public void moveBackward() {
System.out.println("오토바이가 뒤로 후진합니다!");
}
}
역할과 구현의 분리라고 한다.| 접근 제어자 | 클래스 내 | 패키지 내 | 다른 패키지의 하위 클래스 | 패키지 외 | 설명 |
|---|---|---|---|---|---|
| private | O | X | X | X | 동일 클래스 내에서만 접근 가능 |
| default | O | O | X | X | 동일 패키지 내에서만 접근 가능 |
| protected | O | O | O | X | 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능 |
| public | O | O | O | O | 접근 제한 없음 |
public class Car {
String model;
String color;
int wheels;
// Car 클래스의 고유 속성
boolean isConvertible;
void moveForward() {
System.out.println("앞으로 전진!");
}
void moveBackward() {
System.out.println("뒤로 후진!");
}
// Car 클래스의 고유 기능
void openWindow() {
System.out.println("모든 창문을 연다!");
}
}
public class MotorBike {
String model;
String color;
int wheels;
// MotorBike 클래스 고유 속성
boolean isRaceable;
void moveForward() {
System.out.println("앞으로 전진!");
}
void moveBackward() {
System.out.println("뒤로 후진!");
}
// MotorBike 클래스 고유 기능
public void stunt() {
System.out.println("묘기 부리기!");
}
}
// 추상화를 통해 상위 클래스 정의
public class Vehicle {
String model;
String color;
int wheels;
void moveForward() {
System.out.println("앞으로 전진!");
}
void moveBackward() {
System.out.println("뒤로 후진!");
}
}
// Car 클래스
public class Car extends Vehicle {
boolean isConvertible;
void openWindow() {
System.out.println("모든 창문을 열다!");
}
}
// MotorBike 클래스
public class MotorBike extends Vehicle {
boolean isRaceable;
// 메서드 오버라이딩 -> 기능 재정의
@Override
void moveForward() {
System.out.println("오토바이가 앞으로 전진합니다!");
}
public void stunt() {
System.out.println("묘기를 부립니다!");
}
}
// Main 클래스
public class Main {
public static void main(String[] args) {
// 원래 사용했던 객체 생성 방식
Car car = new Car();
MotorBike motorBike = new MotorBike();
// 다형성을 활용한 객체 생성 방식
Vehicle car2 = new Car();
}
}
public class Main {
public static void main(String[] args) {
// 상위 클래스 타입의 객체 배열 생성
Vehicle vehicles[] = new Vehicle[2];
vehicles[0] = new Car();
vehicles[1] = new MotorBike();
for(Vehicle vehicle : vehicles)
System.out.println(vehicle.getClass());
}
}
------------- 출력 ------------
class Car
class MotorBike
// Driver 클래스
public class Driver {
void drive(Car car) {
car.moveForward();
car.moveBackward();
}
void drive(MotorBike motorBike) {
motorBike.moveForward();
motorBike.moveBackward();
}
}
// main 클래스
public class Main {
public static void main(String[] args) {
Car car = new Car();
MotorBike motorBike = new MotorBike();
Driver driver = new Driver();
driver.drive(car);
driver.drive(motorBike);
}
}
관련 설명 : https://mangkyu.tistory.com/226
일급 객체 (First-Class Object) : 프로그래밍 언어에서 특별한 권한 없이 아래 조건을 충족하는 객체
1. 변수나 데이터 구조 안에 담을 수 있어야 한다.
2. 함수의 인자로 전달할 수 있어야 한다.
3. 함수의 반환 값으로 사용할 수 있어야 한다.일급 함수 (First-Class Function) : 함수형 프로그래밍에서 함수를 변수에 저장하고 함수를 함수의 인자로 전달하거나 함수를 함수의 반환값으로 사용할 수 있는 것.