3.2 객체생성

작성자 : 진은영 ( 2004-07-13 )

[메인] [목록]

목차

3.2.1 객체생성

① 객체를 생성하는 것은
클래스를 정의했다고 해서 바로 사용할 수 있는 것은 아니다. 자동차를 만들기 위해 먼저 도면을 설계하고 , 아파트를 짓기 위해서도 마찬가지로 건설도면을 설계하는 것처럼 우리가 원하는 객체를 생성하기 위해서도 도면을 설계해야 한다. 그것이 지난 강좌의 클래스이다. 클래스를 이용해서 객체를 메모리에 올리는 것을 객체생성이라 한다. 이렇게 메모리상에 생성된 클래스를
  • 클래스 객체
  • instance
라고들 한다. 여기에서는 인스턴스라고 사용하겠다.

② 객체를 생성하기 위한 순서
객체를 생성하기 위해서는 아래와 같은 규칙이 있다.
  1. 인스턴스 변수 선언
  2. 객체 생성

  1. 인스턴스 변수 선언
      멤버변수의 선언에서 보았던 것처럼 변수를 선언하면 된다.
      중요한 것은 DataType 인데 생성하고 싶은 클래스의 타입을 넣어주면 된다.
      Car car = null ;
      StockAccount account = null ;

  2. 객체 생성 생성이란 단어가 처음으로 나왔다. 생성하기 위해서는 new 라는 연산자가 사용된다. 앞에서도 강조했지만 왼쪽의 DataType과 오른쪽의 DataType이 같아야 한다.

      car = new Car() ;
      account = new StockAccount() ;



      객체생성을 설명하면서 약간의 메모리 구조에 대해 설명하려 한다.
      여러분의 이해를 돕기 위해 나열하는 메모리 구조인데, 정작 이것으로 인해 딜레마에 빠지질 않기를 바라는 마음이다.
      메소드내에 선언되는 변수들이 저장되는 곳인 stack영역과 객체의 변수들이 저장되는 heap영역이 있다.
      • statck : 메소드내에서 선언되는 변수들이 저장. 메소드가 끝나면 같이 없어지는 영역이다.
      • heap : 객체가 생성되어 변수들이 저장되는 영역. 객체가 더이상 사용되지 않는 시점에 GC(Garbage Collection : 청소부)의 대상이 된다.

      ① 인스턴스 변수를 선언했다고 해서 메모리에 바로 생성되는 것은 아니다. 먼저 stack영역에 car변수가 정의되고 default값으로 null이 채워딘다.
      Car car = null ;

      ② new 연산자를 이용해서 클래스의 내용을 메모리에 올린다. 바로 Heap영역에 자리를 잡게 된다.
      new Car() ;

      ③ 클래스의 내용이 다 올라간 후 주소번지를 부여 받게 되는데 이 번지를 car변수에 대입한다.
      car = 주소번지

      ④ 마지막으로 stack에 있는 car변수는 heap영역의 객체내용을 가리키게 된다. 그래서 car변수를 reference 변수라고도 한다.
      여기에서 중요한 내용은 car변수의 내용이다. car변수는 값을 가지고 있는 것이 아니라 주소를 가지고 있는 참조변수라는 것을 꼭 기억하기 바란다.

③ 예제
Car 클래스를 생성한 후 다시 객체를 생성해 보자.
  1. 추상화한다.
      멤버변수 : 차이름 , 차브랜드 , 색상
      메소드 : 이름과 브랜드와 색상을 출력하는 print

  2. 클래스로 구현한다.
      class Car {
              //멤버변수 선언
              String name ; 
              String brand ;
              String color ; 
      
              //메소드 선언
              public void print(){
                      //이름 , 브랜드 , 색상 출력하는 내용 구현
                      System.out.println( name + " / " + brand + " / " + color  ) ; 
              }
      }
      

  3. 객체 생성한다.
    객체를 생성하기 위해 CarTest 클래스를 구현한다. CarTest에는 실행하기 위한 main() 하나만 존재하면 된다.
      public class CarTest {
              public static void main( String [] args ){
                      // 1. 변수 선언
                      // 2. 객체 생성
      
                      Car car = null ; 
                      car = new Car() ; 
              }
      } 
      

      Main()는 반드시 위와 같은 형태를 지켜야 한다. jvm이 이 클래스를 실행시켰을 때 따로 메소드명을 지정하지 않아도 가장먼저 호출하는 메소드이기 때문이다. CarTest 클래스가 실행되면 car객체는 아래와 같이 메모리에 로드된다.





3.2.2 객체사용

생성한 객체를 사용하기 위해서는 아래와 같은 순서가 있다.
  • 묵시적 초기화
  • 명시적 초기화

  1. 클래스를 정의할 때 default값을 따로 지정하지 않았다면, 메모리 로드시 default값을 정해준다.
      String name ==> null
      int age ==> 0
      double salary ==> 0.0

  2. 객체를 생성한 후 개발자가 명시적으로 값을 대입해 줄 수 있다.

      car.name = "매그너스 이글" ;
      car.brand = "GM 대우" ;
      car.color = "아이보리" ;



  3. 메소드 호출

      car.print() ;

  4. 클래스 전체 코드를 보자
      public class CarTest {
              public static void main( String [] args ){
                      // 1. 변수 선언
                      // 2. 객체 생성
      
                      Car car = null ; 
                      car = new Car() ; 
      
      		car.name = "매그너스 이글" ;
      		car.brand = "GM 대우" ; 
      		car.color = "아이보리" ; 
      
      		car.print() ; 
              }
      }
      
      결과

      ---------- java ----------
      매그너스 이글 / GM 대우 / 아이보리
      출력 완료 (1초 경과) - 정상 종료


3.2.3 회사 사원 객체 생성 예제

① EmployeesTest 클래스 구현
홍길동 : en001 , 부장 , 1000000 의 객체 생성
갑순이 : en002 , 사원 , 700000의 객체 생성
public class EmployeesTest {
        public static void main( String [] args ){
                Employees emp1 = null , emp2 = null ; 

                emp1 = new Employees() ; 
                emp1.empID = "en001" ; 
                emp1.name = "홍길동" ; 
                emp1.position = "부장" ; 
                emp1.salary = 1000000 ; 

                emp2 = new Employees() ; 
                emp2.empID = "en002" ; 
                emp2.name = "갑순이" ; 
                emp2.position = "사원" ; 
                emp2.salary = 700000 ; 

                emp1.print() ; 
                emp2.print() ; 
        }
}
결과

---------- java ----------
홍길동님의 직위는부장이며 급여는 1100000이다.
갑순이님의 직위는사원이며 급여는 800000이다.
출력 완료 (0초 경과) - 정상 종료
참고로 Employees 클래스와 EmployeesTest 클래스는 같은 폴더에 있어야 한다.
참고문헌
  • 클릭하세요 자바 2 [대림]