본문 바로가기
Java

[자바의 신] 클래스와 객체는 같은건가?

by 개발자의 2020. 9. 9.

소스코드

 - github.com/jeong-woon/TIL/blob/master/godofjava/Bicycle.java

 - github.com/jeong-woon/TIL/blob/master/godofjava/BicycleFactory.java

 

지난 글에서 현실세계의 사물(또는 추상적 개념)을 객체지향 프로그램에서 사용하는 객체로 만들기위해 클래스로 만드는 방법을 학습했다. 그러면, 클래스와 객체는 같은걸까?

 

결론적으로 클래스는 객체가 아니다.

 

아래 그림을 보자.

클래스와 인스턴스

자전거 공장에서 자전거를 만들때, 자전거 설계도(A)를 보고 자전거(B)를 만들 것이다. 이 때, A가 클래스에 해당하고, B가 객체(혹은 인스턴스)에 해당한다. 결국 클래스는 객체를 만들기 위한 설계도라고 할 수 있다. 

 

사실 클래스는 그 자체로 아무 일도 할 수 없다. 객체(인스턴스)로 만들어야만 사용할 수 있다. 위의 예에서 자전거의 설계도는 탈 수 없고, 자전거로 만들어야만 탈 수 있는것과 같이 생각하면 쉽다.

 

객체, 인스턴스는 어떻게 만들까?

우선, 클래스를 실행하기 위해서는 main 메소드가 필요하기 때문에 아래와 같이 BicycleFactory 클래스를 만들자. 

public class BicycleFactory {
    public static void main(String[] args) {
    	System.out.println("BicycleFactory is running!");
    }
}

다음으로 이전에 만든 Bicycle 클래스를 수정하자.

public class Bicycle {
    // 변수(상태) 시작
    private String color;	// 색상
    private String grip;	// 손잡이모양
    private int speed;		// 속도
    private int distance;	// 거리
    private int weight;		// 무게
    // 변수(상태) 끝
	
    // 생성자 추가
    public Bicycle(){
    }
    
    // 메소드(행위) 시작
    public void rideOn(){
    	// 올라탐
    }
    
    public void rideOff(){
    	// 내림
    }
    
    public void speedUp(){
    	speed = speed+5;
    }
    
    public void speedDown(){
    	speed = speed-10;
    }
    
    public void changeGear(){
    	// 기어 바꿈
    }
    
    // 현재 속도 출력
    public int getCurrentSpeed(){
    	return speed;
    }
    // 메소드(행위) 끝
}

변경사항은 다음과 같다.

1. 매개변수가 없는 생성자 추가

   - 생성자가 없는 경우 컴파일러가 기본생성자 추가해 주지만, 명시적으로 만들어줌.

2. speedUp, speedDown 메소드 기능 추가

   - speedUp 호출시 speed에 5씩 증가함.

   - speedDown 호출시 speed가 10씩 감소함.

3. getCurrentSpeed 메소드 추가

   - getCurrentSpeed호출시 현재 speed 출력.

 

그리고 4대의 자전거를 만들어보자. 아래의 방법으로 객체를 생성한다. 

public class BicycleFactory {
    public static void main(String[] args) {
    	System.out.println("BicycleFactory is Running!");
        
        Bicycle bicycle1 = new Bicycle(); // 1번 자전거 인스턴스 생성
        Bicycle bicycle2 = new Bicycle(); // 2번 자전거 인스턴스 생성
        Bicycle bicycle3 = new Bicycle(); // 3번 자전거 인스턴스 생성
        Bicycle bicycle4 = new Bicycle(); // 4번 자전거 인스턴스 생성
    }
}

 

자전거 생성부분(Bicycle bicycle1 = new Bicycle();)을 다시 보면 아래와 같은 모양이다.

[클래스 이름] [변수명] = new [클래스 생성자];

하나씩 살펴보면,

  1. [클래스 이름]
    • 인스턴스의 형태를 의미한다.
  2. [변수명]
    • 인스턴스의 이름을 의미한다.
    • 어떤 이름을 써도 상관 없지만, 네이밍을 잘 하는 것이 중요하다.
  3. new
    • 자바 예약어, new 뒤에 클래스의 생성자를 지정.
  4. [클래스 생성자]
    • 클래스안에 클래스와 이름이 같고, 반환타입이 없는 메소드 형태의 코드(?)
    • 객체(인스턴스)를 만들기 위한 거의 유일한 도구.
    • 기본생성자(매개변수가 없는 생성자)는 컴파일러가 생성함.
    • 매개변수가 있는 생성자가 있을때는 컴파일러가 기본 생성자를 만들어주지 않음.

 

인스턴스를 만들면 아래와 같이 인스턴스의 메소드를 호출하는 방식으로 상태를 변경시킬수 있다.

public class BicycleFactory {
    public static void main(String[] args) {
        
        // 코드 생략
        
        bicycle1.speedUp();	// 페달을 밟는 메소드 호출
        bicycle1.speedUp();	// 페달을 밟는 메소드 호출
        System.out.println("bicycle1 current speed = " + bicycle1.getCurrentSpeed());
        bicycle2.speedUp(); // 페달을 밟는 메소드 호출
        System.out.println("bicycle2 current speed = " + bicycle2.getCurrentSpeed());
        bicycle3.speedUp();	// 페달을 밟는 메소드 호출
        System.out.println("bicycle3 current speed = " + bicycle3.getCurrentSpeed());
        bicycle4.speedUp(); // 페달을 밟는 메소드 호출
        bicycle4.speedUp(); // 페달을 밟는 메소드 호출
        System.out.println("bicycle4 current speed = " + bicycle4.getCurrentSpeed());
        
        bicycle1.speedDown();	// 브레이크를 잡는 메소드 호출
        System.out.println("bicycle1 current speed = " + bicycle1.getCurrentSpeed());
        bicycle4.speedDown();	// 브레이크를 잡는 메소드 호출
        System.out.println("bicycle4 current speed = " + bicycle4.getCurrentSpeed());
    }
}

실행 결과 

BicycleFactory is Running!

bicycle1 current speed = 10

bicycle2 current speed = 5

bicycle3 current speed = 5

bicycle4 current speed = 10

bicycle1 current speed = 0

bicycle4 current speed = 0

 

정리,

클래스는 객체(혹은 인스턴스)를 만들기 위한 설계도이다.

클래스로 만든 객체(혹은 인스턴스)를 통해 일을 시킬수 있다.