Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Tags
more
Archives
Today
Total
관리 메뉴

개발계발

객체 지향 프로그래밍 본문

자바

객체 지향 프로그래밍

Ju_Nik_E 2024. 4. 26. 20:40

객체 지향 프로그래밍이란?

부품에 해당하는 객체들을 먼저 만들고, 이 객체들을 하나씩 조립해서 완성된 프로그램을 만드는 기법이다

 

객체란?

물리적인 존재 혹은 개념적인 존재 등 다른 것과 식별 가능한 것을 말한다.
ex) 자동차, 자전거, 책, 강의, 주문 등

 

- 객체는 속성과 동작으로 구성된다. 예를 들어 사람이라는 객체는 "이름, 나이 등"의 속성이 있고, "웃다, 걷다" 등의 동작이 있다.

- 자바에서는 속성 == 필드, 동작 == 메소드 라고 한다.

 

운전하는 프로그램 생성 예시

- 사람 객체

- 자동차 객체(엔진 객체, 타이어 객체, 핸들 객체 등등)

 

 

-> 위의 그림처럼 엔진, 타이어, 핸들 객체가 모여 자동차 객체를 이루고, 사람이 해당 객체를 이용함으로써 운전하는 프로그램이 완성된다.


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

캡슐화

- 위에서 설명한 필드와 메소드를 하나로 묶고 구현 내용을 감춰, 외부에서는 객체 내부의 구조를 알지 못하며, 객체가 노출하는 필드와 메소드만 이용할 수 있도록 한다.

상속

- 부모 객체가 가지고 있는 필드와 메소드를 자식 객체에 물려줄 수 있다.

다형성

- 사용 방법은 동일하지만 실행 결과가 다양하게 나오게 할 수 있다.


객체를 생성하려면?

객체를 생성하려면 설계도가 필요한데, 자바에서는 이를 클래스라고 한다.
어렵게 설명할 필요없이 아래의 예시를 보자

(클래스 선언시 맨 앞 알파벳을 대문자로 쓴다)

// 자동차 클래스

public class Car {
    // 필드
    String model = "현대";
    int speed = 60;
    
    // 메소드
    void go() {
    	System.out.println("차가 출발합니다.");
	}
    void stop() {
    	System.out.println("차가 멈춥니다.");
	}
}

 

위 코드가 기본적으로 필드와 메소드를 포함하고 있는 클래스이다.

위 코드로도 객체를 생성할 수 있으나, 사실 생성자가 숨겨져 있다.(개발자가 생성자를 명시하지 않으면 자동으로 생성)

아래 코드를 보자

// 자동차 클래스

public class Car {
    // 필드
    String model = "현대";
    int speed = 60;
    
    // 생성자
    public Car() { }
    
    // 메소드
    void go() {
    	System.out.println("차가 출발합니다.");
	}
    void stop() {
    	System.out.println("차가 멈춥니다.");
	}
}

 

위와 같이 Car클래스의 생성자를 통해 다른 클래스에서 Car라는 객체를 생성해서 사용할 수 있다.

객체를 생성하는 코드는 아래와 같다.

Car myCar = new Car(); // 객체 생성

System.out.println(myCar.model) // 현대
System.out.println(myCar.speed) // 60

 

-> 생성자는 자동으로 만들어지니까 명시할 필요가 없나?

답은 NO다. 객체를 다양하게 초기화할 경우 생성자를 직접 선언할 수 있다.

아래의 예시를 보자

// Korean 클래스

public class Korean {
	// 필드
    String nation = "대한민국";
    String name;
    String ssn;
    
    // 생성자
    public Korean(String name, String ssn) {
    	this.name = name;
        this.ssn = ssn;
    }
}

 

위 코드처럼 한국인이라면 국적은 대한민국으로 동일하지만, 이름과 주민등록번호는 객체마다 다른 값을 가지게 된다.

그렇기 때문에 name, ssn은 매개변수로 받아 새롭게 설정해주는 것이다.

이제 객체를 생성할 때 아래와 같은 과정을 거치게 된다.

Korean new_person = new Korean("한국인", "123456-7891011");

System.out.println(new_person.nation); // "대한민국"
System.out.println(new_person.name); // "한국인"
System.out.println(new_person.ssn); // "123456-7891011"

 

그럼 Korean 클래스에서 사용한 this는 무엇인가?

-> 생성자의 매개변수와 클래스의 필드의 name, ssn이 이름이 동일하기 때문에 필드임을 구분하기 위해 this 키워드를 사용하는 것

 

생성자 여러 개 사용하기(오버로딩)

(오버로딩이란 매개변수의 타입, 개수, 순서만 다르게 여러 개의 생성자를 선언하는 것)

아래 코드와 같이 생성자를 여러개 사용할 수도 있다.

// Car 클래스

public class Car {
	// 필드
    String company = "현대";
    String model;
    String color;
    int maxSpeed;
    
    // 생성자들
    Car() {}
    
    Car() {
    	this.model = model;
    }
    
    Car(String model, String color) {
    	this.model = model;
        this.color = color;
    }
    
    Car(String model, String color, int maxSpeed) {
        this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
}

 

위 코드의 생성자에는 처음 코드와 다르게 public이라는 키워드를 쓰지 않았는데, 생성자에 해당 키워드를 생략할 경우 default라는 접근 제한을 갖게 된다. 이는 이 후 접근 제한자 포스팅에서 설명할 예정이다.

 

메소드

클래스에서 메소드를 선언했다고 바로 선언할 수 있는 것은 아니다.
메소드는 객체의 동작이므로 객체를 먼저 생성하고 호출해야 한다.
아래와 같이 사용하면 된다.

 

// Car 클래스
public class Car {
	// 필드
    int gas;
    
    // 생성자는 생략
    
    // 메소드
    void setGas(int gas) {
		this.gas = gas;
    }
}

public class CarExample {
	public static void main(String[] args) {
		// Car 객체 생성
        Car myCar = new Car();
        
        // 메서드 호출
        myCar.setGas(5):
        
        //실행 결과 확인
        System.out.println(myCar.gas) // 5
	}
}

 

메소드도 오버로딩이 가능하다.

'자바' 카테고리의 다른 글

상속  (1) 2024.04.26
접근 제한자  (0) 2024.04.26
final 키워드  (0) 2024.04.26
인스턴스 멤버와 정적 멤버  (0) 2024.04.26
자바 문자열 타입  (1) 2024.04.22