brunch

You can make anything
by writing

C.S.Lewis

by 서준수 Mar 19. 2019

자바의 객체 (2/3)

객체 생성

객체 생성과 메모리 구조 (1/2)


1. 객체 생성의 기본 형태

 객체 생성의 기본 형태는 다음과 같다.


 클래스형 참조형 변수 = new 클래스형(인자);


 그리고 해당 객체의 속성과 동작, 즉 클래스의 멤버(인스턴스 변수, 함수)에 접근을 하기 위해서는 다음과 같은 형태를 가진다.


 참조형 변수.인스턴스변수;

 참조형 변수.함수명(인자);


 

참조형 변수?

  자바에 존재하는 8가지의 기본 데이터형을 제외한 모든 데이터형은 참조 데이터형이다. 이러한 참조 데이터형에 대한 변수를 참조형 변수라고 한다. 기본 데이터형은 boolean, byte, char, int, short, long, float, double이다. 대표적인 참조 데이터형으로는 클래스, 배열, 인터페이스 등이 있다.



이를 바탕으로 앞서 봤던 HelloWorld 클래스를 자세히 살펴보자.


public class HelloWorld {

    public static void main(String[] args) {

        System.out.println("Hello World!");

        Developer developer = new Developer();

        developer.eat();

        developer.sleep();

        developer.coding();

        Developer developer2 = new Developer();

    }

}


 클래스형(Class type)은 Developer 클래스이며 참조형 변수는 developer이다. 기본 생성자를 사용하여 별도의 파라미터가 없기 때문에 인자는 존재하지 않고 new Developer();로 객체를 생성했다.

 이때 클래스의 멤버 중 eat(), sleep(), coding() 함수에 접근하였다.


 그런데 인스턴스 변수에는 왜 접근하지 않았을까? 먼저 인스턴스 변수의 접근 지정자가 private라서 직접적인 접근이 불가능하다. 따라서 접근 가능한 getter, setter를 생성하여 접근하도록 한다. (접근 지정자와 캡슐화 관련해서는 별도로 정리를 해야겠다.)


 그래서 Developer 클래스에 getter, setter를 추가한다. 이때 name과 age를 초기화시켜줄 파라미터를 2개 가지는 생성자도 추가해주자.


public class Developer {

    private String name;

    private int age;

    public Developer() {

        System.out.println("Developer Object is created!");

    }

    public Developer(String name, int age) {

        this.name = name;

        this.age = age;

    }

    public Developer(String name, int age) {

        this.name = name;

        this.age = age;

    }

    public void eat() {

        System.out.println("eat");

    }

    public void sleep() {

        System.out.println("sleep");

    }

    public void coding() {

        System.out.println("coding");

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

}



 getter, setter도 결국 함수이기 때문에 접근 방식은 같다.


public class HelloWorld {

    public static void main(String[] args) {

        System.out.println("Hello World!");

        Developer developer = new Developer();

        developer.eat();

        developer.sleep();

        developer.coding();

        developer.setName("Tom");

        developer.setAge(23);

        System.out.println("name = " + developer.getName() + ", age = " + developer.getAge());

        Developer developer2 = new Developer();

    }

}


Hello World!

Developer Object is created!

eat

sleep

coding

name = Tom, age = 23


 

 developer2는 다음과 같이 추가한 생성자를 사용하여 곧바로 name과 age에 값을 할당하도록 해보자.


public class HelloWorld {

    public static void main(String[] args) {

        System.out.println("Hello World!");

        Developer developer = new Developer();

        developer.eat();

        developer.sleep();

        developer.coding();

        developer.setName("Tom");

        developer.setAge(23);

        System.out.println("name = " + developer.getName() + ", age = " + developer.getAge());

        Developer developer2 = new Developer("Jerry", 20);

        System.out.println("name = " + developer2.getName() + ", age = " + developer2.getAge());

    }

}


Hello World!

Developer Object is created!

eat

sleep

coding

name = Tom, age = 23

name = Jerry, age = 20


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari