Back-end/Java

다시 하자 기초! 객체와 클래스

이안_ian 2019. 4. 17. 19:10
반응형

클래스와 객체

클래스란 '객체를 정의해 놓은 것' 또는 '객체의 설계도'라고 정의 할 수 있다. 클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다.

클래스의 정의 - 객체를 정의해 놓은 것

클래스의 용도 - 객체를 생성하는데 사용

 

객체의 정의 - 실제로 존재하는 것. 사물 또는 개념

객체의 용도 - 객체가 가지고 있는 기능과 속성에 따라 다름

 

유형의 객체 - 책상, 의자, 자동차 등 사물

무형의 객체 - 수학공식, 프로그램 에러와 같은 논리나 개념

 

실생활 예를 들어보면 TV설계도(클래스)는 TV라는 제품(객체)을 정의한 것이며, TV(객체)를 만드는데 사용된다.

또한 클래스는 객체를 생성하는데 사용될 뿐 객체 그 자체는 아니다.

 

클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 잘 만든 설계도 하나만 있으면 제품을 만드는 일이 쉬워 지기 때문이다. 매번 고민할 필요없이 설계도대로만 만들면 되기 때문이다.

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.

 

클래스 (인스턴스화)→ 인스턴스(객체)

객체의 구성요소

객체는 속성과 기능, 두 종류로 이루어져 있으며 일반적으로 객체는 다수의 속성과 다수의 기능을 갖는다. 즉 객체는 속성과 기능의 집합이다. 그리고 그것을 그 객체의 멤버라 한다. 

속성 - 멤버변수, 특성, 필드, 상태

기능 - 메소드, 함수, 행위

인스턴스의 생성과 사용

1. 클래스명 변수명;                    //클래스의 객체를 참조하기 위한 참조변수를 선언

2. 변수명 = new 클래스명();        // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

 

1. Tv t;

Tv클래스 타입의 참조변수 t를 선언한다. 메모리에 참조변수 t를 위한 공간이 마련된다. 아직 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 할 수 없다.

 

2. t = new Tv();

연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 주소가 0x100인 곳에 생성되었다고 가정했을 때 이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화된다. 

 

인스턴스와 참조변수의 관계는 마치 리모콘과 같다. TV리모콘(참조변수)을 사용하여 TV(인스턴스)를 다루기 때문이다. 다른 점이라면, 인스턴스는 오직 참조변수를 통해서만 다룰 수 있다는 점이다. 그리고 에어컨 리모콘과 TV리모콘이 다르게 존재하는 것처럼 Tv인스턴스를 사용하려면, Tv클래스 타입의 참조변수가 필요하다.

 

참조변수는 같은 인스턴스를 가리키는 것은 가능하지만 하나의 참조변수는 다수의 인스턴스를 가리키지는 못함

객체 배열

생성하는 방법은 Tv[] tvArr = new Tv[3]; 이다.

각 요소는 참조변수의 기본값인 null로 자동 초기화 된다. 그리고 이 객체 배열은 3개의 객체를 저장 가능

하지만 그저 객체를 다루기 위한 참조변수를 생성한 것 뿐이지 객체가 생성되지않았다. 그렇기 때문에 객체를 생성해서 배열의 각 요소에 저장하는 것을 잊으면 안된다.

 

ex) Tv[ ] tvArr = new Tv[100];

for(int i=0;i<tvArr.length;i++){

 tvArr[i] = new Tv();

}

모든 배열이 그렇듯이 객체 배열도 같은 타입의 객체만 저장할 수 있다. 그러면 여러 종류의 객체를 하나의 배열에 저장 할 순 없을까?? 다음 장에 나오는 '다형성'을 배우고나면 하나의 배열로 여러 종류의 객체를 다룰 수 있을 것이다.

생성자

생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'이다. 따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.

1. 생성자의 이름은 클래스의 이름과 같아야 한다.

2. 생성자는 리턴값이 없다.

 

기본 생성자

클래스내에 생성자가 없을 경우 자동으로 만들어 주는 것이다. 하지만 클래스에 정의 된 생성자가 하나도 없을 때다.

ex)

class Data1{

 int value

}

 

class Data2{

int value;

Data2(int x){

value=x;

}

}

이렇게 만들고 Data1,2를 생성할 경우 Data2는 컴파일 에러가 난다 그 이유는 생성자가 하나가 존재 하기에 컴파일러가 자동으로 생성을 안해줬기 때문이다.

 

변수의 초기화

변수를 선언하고 처음으로 값을 저장하는 것을 변수의 초기화라고 한다. 변수의 초기화는 경우에 따라서 필수적이기도 하고 선택적이기도 하지만 가능하면 선언과 동시에 적절한 값으로 초기화 하는 것이 바람직하다. 멤버 변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초기화하지 않고 사용해도 되지만, 지역변수는 사용하기전에 반드시 초기화 해야한다.

 

명시적 초기화

변수를 선언과 동시에 초기화 하는 것을 명시적 초기화라고 한다.

 

초기화 블럭

클래스 초기화 블럭 - 클래스 변수의 복잡한 초기화에 사용, 메모리에 처음 로딩될 때 1번만 수행

인스턴스 초기화 블럭 - 인스턴스 변수의 복잡한 초기화에 사용, 인스턴스 생성할 때 마다 수행

 

class InitBlock{

static { /*클래스 초기화 블럭 입니다. */ }

{ /*인스턴스 초기화블럭 입니다.*/ }

}

초기화 순서

 

클래스 초기화 블럭이 제일 먼저 실행이 되고 그 다음에 생성자로 객체를 찍어 내면 생성자 안에 있는 sysout이 먼저 실행되는 것이 아니라 인스턴스초기화 블럭으로 찍은 sysout이 먼저 실행되고 그 다음에 생성자 안에 있는 sysout이 실행 된다. 근데 여기서 만약 명시적 초기화가 있다면 인스턴스 초기화 블럭보다도 먼저 실행된다.

 

 

 

 

 

반응형