본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/4. 객체지향 프로그래밍

2. Java 자바 - 객체와 클래스

객체는 설계도를 바탕으로 만들어진다. 설계도를 보고 자동차를 만들 듯, 메모리에서 사용하고 싶은 객체가 있다면,

우선 설계도로 해당 객체를 만드는 작업이 필요하다.

 

즉, 자바에서 설계도는 클래스(class) 이다.

 

클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.

 

클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance)라고 한다.

(자동차 객체는 자동차 클래스의 인스턴스이다.)

 

클래스로 부터 객체를 만드는 과정을 인스턴스화라고 한다.

 

하나의 클래스로부터 여러 개의 인스턴스(객체)를 만들 수 있다. (여러 대의 자동차)

 

 

객체 지향 프로그래밍 개발의 세 가지 단계

 

1. 클래스 설계

 

2. 설계된 클래스를 가지고 사용할 객체 생성

 

3. 생성된 객체를 이용하기

 

main( ) 메소드만 작성해서 실행할 목적으로 클래스를 이용했지만,

main( ) 메소드가 없는 클래스는 객체 생성 과정을 거쳐 사용해야 한다.

 


 

1. 클래스 선언

 

사용하고자 하는 객체를 구상했다면, 그 객체의 대표 이름을 하나 결정하고 이것을 클래스 이름으로 한다.

ex) 자동차 객체의 클래스 : Car

 

클래스 이름은 다른 클래스와 식별할 목적으로 사용되므로 자바의 식별자 작성 규칙에 따라 만들어야 한다.

 

 

클래스 이름 작성 규칙

 

작성 규칙

  하나 이상의 문자로 이루어져야 한다.

  Car, SportsCar

  첫 번째 글자는 숫자가 올 수 없다.

  3Car ( X )

  '$', '_' 외의 특수 문자는 사용할 수 없다.

  $Car, _Car, @Car ( X ), #Car ( X )

  자바 키워드는 사용할 수 없다.

  int ( X ), for ( X )

 

자바에서는 영어 대소문자를 다른 문자로 취급하기 때문에 클래스 이름도 영어 대소문자를 구분한다.

(클래스 이름은 한글도 가능하긴 하다..)

 

관례) 서로 다른 단어가 혼합된 이름이라면 각 단어 첫 머리 글자는 대문자로 작성한다.

( ChatClient, Web_Browser )

 

클래스 이름을 정했다면 "클래스이름.java"로 소스 파일을 생성해야 한다.

 

소스 파일 이름 역시 대소문자를 구분하므로 반드시 클래스 이름과 소스 파일 이름이 일치해야 한다.

 

 

소스 파일을 열고 아래와 같이 클래스를 선언한다.

 

public class 클래스이름 {

}

 

public class 키워드는 클래스를 선언할 때 사용, 반드시 소문자로 작성한다. (public : 접근 제한자)

 

일반적으로 소스 파일당 하나의 클래스를 선언하지만, 두 개 이상의 클래스 선언도 가능하다.

 

public class Car {

}

class Tire {

}

 

두 개 이상의 클래스가 선언된 소스 파일을 컴파일 하면, 바이트 코드 파일 (.class) 은

클래스를 선언한 개수만큼 생성된다.

 

위의 코드를 컴파일하면, Car.class, Tire.class 파일이 각각 생성된다.

(소스 파일은 클래스 선언을 담고있는 저장 단위일 뿐이다.)

 

주의할 점!!

 

파일 이름과 동일한 이름의 클래스 선언에만 public 접근 제한자를 붙일 수 있다.

만약 파일 이름과 일치하지 않는 클래스 선언에 public 접근 제한자를 붙이면 컴파일 에러가 발생한다.

 

따라서 파일 하나당 동일한 이름의 클래스 하나를 선언하는 것이 좋다.

 


 

2. 객체 생성과 클래스 변수

 

클래스를 선언한 다음, 컴파일을 했다면 객체를 생성할 설계도가 만들어진 것이다.

(이클립스에서 저장 시 .class 파일이 만들어지면서 컴파일 된다.)

 

클래스로부터 객체를 생성하는 방법은 new 연산자를 사용한다.

 

new 클래스();

 

new 연산자로 생성된 객체는 메모리 힙 영역에 생성된다.

 

 

 

메모리 내에서 객체의 위치를 알 수 있도록 new 연산자는 힙 영역에 객체를 생성 후

객체의 주소를 반환한다.

 

 


 

3. 생성된 객체 이용하기

 

new 연산자가 반환한 주소를 참조 타입인 클래스 변수에 저장해 두면, 변수를 통해 객체를 사용할 수 있다.

 

아래는 클래스 타입으로 선언된 변수에 new 연산자가 반환한 객체의 주소를 저장하는 코드이다.

 

클래스 변수;

변수 = new 클래스();

 

클래스 변수 선언과 객체 생성을 한 개의 실행문으로 작성할 수 있다.

 

클래스 변수 = new 클래스();

 

new 연산자로 객체를 생성하고 반환된 객체의 주소를 변수에 저장하면,

아래와 같이 변수가 객체를 참조하게 된다.

 

 

 

예제) Student 클래스를 선언하고, StudentExample 클래스의 main( ) 메소드에서 Student 객체를 생성한다.

 

Student.java (클래스 선언)

public class Student {
}

 

StudentExample.java (클래스로부터 객체 생성)

public class StudentExample {
    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println("s1 변수가 Student 객체를 참조합니다.");
        
        Student s2 = new Student();
        System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
    }
}

 

StudentExample.class 가 실행되면 아래 그림과 같이 메모리에 클래스 변수와 객체가 생성된다.

 

new 연산자로 각각의 객체가 생성된다.

 

Student 클래스는 하나지만, new 연산자를 사용한 만큼 객체가 메모리에 생성된다.

 

이런 객체들은 Student 클래스의 인스턴스들이다.

 

같은 클래스 Student 에서 생성되었지만,

s1, s2가 참조하는 Student 객체들은 완전히 독립된 서로 다른 객체이다.

 

Student 와 StudentExample 클래스의 용도는 서로 다르다.

 


 

클래스의 용도 구분

 

1. 라이브러리 용도(API : Application Program Interface)

 

   라이브러리 클래스는 다른 클래스에서 이용할 목적으로 설계된다.

   

   Studnet 클래스가 라이브러리 클래스에 해당된다.

   (Student 클래스에 main( ) 메소드를 작성해서 라이브러리인 동시에 실행 클래스로 만들 수 있다.)

 

 

2. 실행 용도

 

   실행 클래스는 프로그램 실행 진입점인 main( ) 메소드를 제공하는 역할을 한다.

 

   StudentExample 클래스가 실행 클래스에 해당된다.

 

 

라이브러리인 동시에 실행 클래스인 형태

public class Student {
    // 라이브러리로서의 코드 (필드, 생성자, 메소드)
    . . .
    
    // 실행을 위한 코드
    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println("s1 변수가 Student 객체를 참조합니다.");
        
        Student s2 = new Student();
        System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
    }
}

 

프로그램이 단 하나의 클래스로 구성된다면, 라이브러리인 동시에 실행 클래스인 형태로 작성하는 것이

좋은 방법일 수 있지만,

 

대부분의 객체 지향 프로그램은 라이브러리(부품 객체, 완성 객체)와 실행 클래스가 분리되어 있다.

(두 클래스를 분리하는 것이 좋다.)