Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

블로그 이름 뭐하지

[JAVA] 객체 지향 프로그래밍의 이해 본문

JAVA

[JAVA] 객체 지향 프로그래밍의 이해

가는말이고우면오는말은come 2024. 9. 20. 20:44

객체

세상에 존재하는 식별이 가능한 것을 뜻한다.

ex. (물리적으로 존재)자동차, 도서관, 사람, (개념적인 것)강의, 운동

 

객체는 속성과 행위로 구성이 되어있다.

ex. 자동차(객체)

속성) 회사, 모델, 색상, 가격...

행위) 가속, 브레이크, 경적...

 

자바에서는 위와 같은 속성을 필드, 행위를 메서드로 구현한다.

◀현실세계의 객체를 소프트웨어의 객체로 설계하는 것을 '객체 모델링'이라고 부른다.

 

객체들은 서로 행위(메서드)를 통해 상호작용하고, 데이터를 주고 받는다.

메서드 호출 시 괄호()안에 데이터를 넣어 호출 할 수 있는데, 이를 파라미터 또는 매개값이라고 표현한다.

ex. gasPedal(50) >> 매개값(파라미터): 50

이 메서드를 통해 반환되는 값을 리턴 값이라고 표현한다.

ex. return speed >> 리턴값: speed

 

객체 간의 관계

1) 사용관계 : 사람은 차를 사용한다.

2) 포함관계 : 타이어객체, 문객체, 핸들객체는 차 객체에 포함된다.

3) 상속관계 : 기계시스템 객체를 상속받아 자동차객체와 기차객체를 생산한다.

 

객체와 클래스

객체를 생성하기 위해서는 설계도(클래스)가 필요하다

클래스를 토대로 만들어진 객체를 인스턴스라고 부르며 이 과정을 '인스턴스 화'라 한다.

동일한 클래스로 여러 개의 인스턴스를 만들 수 있고, 이 모든 인스턴스를 통틀어 객체라 한다.

 

객체지향 프로그래밍의 특징

1) 캡슐화

필드와 메서드를 하나로 묶어 객체로 만든 후 실제 구현 내용은 외부에서 알 수 없게 감추는 것이다.

외부 객체에서는 노출시켜준 필드 혹은 메서드를 통해 접근할 수 있다.

JAVA에서는 getter, setter, 접근 제어자를 사용한다.

 

캡슐화를 하는 이유

▷ 해당 필드와 메서드의 접근을 제어하여 외부에서 마음대로 객체를 변화시키지 않게 하기 위함

 

class Car {
    // 접근 제어자(private) 사용: 외부에서 접근할 수 없음
    private String model;  
    private int fuelLevel;
    private int speed;
    
    //getter setter로 필드에 접근 가능
    public String getModel(){
    	return this.model;
    }
    public void setModel(String model){
    	this.model = model;
    }

    // 현재 속도를 반환하는 메서드
    // 접근 제어자(public) 사용: 외부 접근 가능
    public int getSpeed() {
        return this.speed;
    }
}

 

2) 상속

부모 객체는 가지고 있는 필드와 메서드를 자식 객체에 물려준다.

이 과정에서 자식 객체가 부모 객체의 필드와 메서드를 사용할 수 있도록 한다.

필요한 경우 자식 클래스에서 기능을 추가하거나 재정의(Override)할 수 있다.

 

상속을 하는 이유

▷ 객체를 상속관계로 묶어 객체간 구조를 파악하기 용이하게 하기 위함

▷ 필드와 메서드 변경시 부모 객체에 있는 것만 수정하면 자식객체에도 반영이 되므로 일관성 유지에 좋음

▷ 자식 객체가 부모 객체의 것을 물려받아 사용하므로 코드 중복이 감소하고 재사용성이 증가

 

class Car {
    private int speed;
    private int fuelLevel;

    public Car() {
        this.speed = 0;
        this.fuelLevel = 100;
    }

    public void accelerate(int increment) {
        this.speed += increment;
        this.fuelLevel -= 5;
    }

    public void displayStatus() {
        System.out.println("Speed: " + speed + " km/h");
        System.out.println("Fuel Level: " + fuelLevel + " %");
    }
}

// Tesla는 Car 클래스를 상속받음(extends)
class Tesla extends Car {
		private boolean autonomousDrivingMode;

    //오버라이딩(재정의)
    //부모 클래스 Car의 메서드 accelerate()를 재정의 함
    @Override
    public void accelerate(int increment) {
        super.accelerate(increment * 2);
    }
}

 

3) 다형성

객체가 연산을 수행할 때, 하나의 행위에 대해 각 객체가 가진 고유한 특성에 따라 여러가지 형태로 재구성 된다.

 

다형성이 필요한 이유

▷ 공통된 명령(메서드)을 내리더라도 다른 연산이 가능해져 코드를 유연하게 확장하고, 수정을 최소화할 수 있음

▷ 기능을 추가하거나 변경할 때도 최소한의 수정이 가능해 유지보수에 유리하며 관리에 효율적임

 

public class Main {
    public static void main(String[] args) {
        Car tesla = new Tesla();  // Car 타입으로 Tesla 객체 생성
        Car bmw = new BMW();  // Car 타입으로 BMW 객체 생성

        tesla.accelerate();  // Tesla의 accelerate() 호출
        bmw.accelerate();  // BMW의 accelerate() 호출

        tesla.displayStatus();
        bmw.displayStatus();
    }
}

 

4) 추상화

객체에서 공통된 부분을 모아 상위 개념으로 새롭게 선언하는 것이다.

복잡한 내부로직을 감추고 상위 개념에서 필요한 부분만 외부에 노출한다.

JAVA에서는 abstract, interface 키워드를 이용한다.

 

추상화가 필요한 이유

▷ 공통적인 특징을 추상화하여 중복코드를 줄일 수 있고, 코드의 재사용성을 높일 수 있다.

▷ 추상화된 부분만 수정하면 되므로 유지보수와 가독성을 높일 수 있다.

 

abstract class Car {
    protected int speed;
    protected int fuelLevel;

    public Car() {
        this.speed = 0;
        this.fuelLevel = 100;
    }

    // 추상 메서드(abstract): 각 자동차마다 가속 방식이 다를 수 있음
    public abstract void accelerate();

    public void displayStatus() {
        System.out.println("Speed: " + speed + " km/h");
        System.out.println("Fuel Level: " + fuelLevel + " %");
    }
}

//추상메서드에 상속받은 클래스들
class Tesla extends Car {
    @Override
    public void accelerate() {
        speed += 60;  // Tesla는 60씩 가속
        fuelLevel -= 5;
    }
}

class BMW extends Car {
    @Override
    public void accelerate() {
        speed += 30;  // BMW는 30씩 가속
        fuelLevel -= 5;
    }
}



'JAVA' 카테고리의 다른 글

[JAVA] 상속  (0) 2024.09.23
[JAVA] 클래스  (0) 2024.09.23
[JAVA] 컬렉션  (0) 2024.09.20
[JAVA] 배열  (0) 2024.09.20
[JAVA] 조건문, 반복문  (0) 2024.09.20