Programming Language/Java

[Java] 객체지향언어(2) | 변수와 메서드, 생성자

성니 2021. 1. 25. 00:31

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788994492032&orderClick=LEa&Kc=

 

Java의 정석 - 교보문고

자바의 기초부터 객제지향개념을 넘어 실전활용까지 수록한『Java의 정석』. 저자의 오랜 실무경험과 강의한 내용으로 구성되어 자바를 처음 배우는 초보자들의 궁금한 점을 빠짐없이 담고 있

www.kyobobook.co.kr

2021/01/24 - [Programming Language/Java] - [Java] 객체지향언어(1) | 클래스와 객체, 인스턴스, 객체 배열

 

[Java] 객체지향언어(1) | 클래스와 객체, 인스턴스, 객체 배열

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788994492032&orderClick=LEa&Kc= Java의 정석 - 교보문고 자바의 기초부터 객제지향개념을 넘어 실전활용까지 수록한『Jav..

i-am-seongni.tistory.com


[변수와 메서드]

* 선언 위치에 따른 변수의 종류

변수는 클래스 변수, 인스턴스 변수, 지역 변수 이렇게 세 종류가 있는데, 변수의 종류를 결정하는 중요한 요소는 '변수의 선언된 위치'이다.

 

지역 변수 : 멤버 변수를 제외한 나머지 변수

클래스 변수 : 멤버 변수 중 static이 붙은 것

인스턴스 변수 : 멤버 변수 중 static이 붙지 않은 것

 

 

- 인스턴스 변수(instance variable)

클래스 영역에 선언되는데, 클래스와 인스턴스를 생성할 때 만들어짐

인스턴스는 독립적인 저장공간을 가지기 때문에 서로 다른 값을 가질 수 있음

인스턴스마다 고유한 상태를 유지해야 하는 속성의 경우는 인스턴스 변수로 선언함

 

 

- 클래스 변수(class variable)

인스턴스 변수 앞에 static을 붙이면 클래스 변수가 생성됨

인스턴스 변수와는 달리, 클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유함

인스턴스 변수와는 달리, 클래스 변수는 인스턴스를 생성하지 않고도 사용할 수 있음

'클래스이름.클래스변수'의 형식으로 사용함

 

클래스가 메모리에 로딩 될 때 생성되어 프로그램이 종료될 때까지 유지됨

public을 앞에 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 전역변수의 성격을 가짐

한 클래스의 모든 인스턴스가 공통적인 값을 유지해야 하는 속성의 경우는 클래스 변수로 선언함

 

 

"인스턴스 변수는 인스턴스가 생성될 때마다 생성되기 때문에,

인스턴스마다 각기 다른 값을 유지할 수 있지만,

클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로,

항상 공통된 값을 갖는다.

 

 

 

* 메서드(method)

메서드(method)는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.

C언어에서의 함수라고 생각하면 쉽다.

 

- 메서드를 사용하는 이유

1. 높은 재사용성

Java API에서 제공하는 메서드는 원하는 만큼 호출할 수 있고, 다른 프로그램에서도 사용 가능하다.

2. 중복된 코드의 제거

프로그램을 작성할 때, 같은 내용의 문장이 자주 반복되는 경우가 있다.

이럴 때 반복되는 문장을 묶어서 하나의 메서드로 작성하면, 중복되는 문장 대신에 메서드를 한번 호출하면 된다. 

3. 프로그램의 구조화

지금까지는 main메서드 안에 모든 문장을 넣어서 프로그램을 작성했지만, 큰 규모의 프로그램의 경우 작업 단위로 나누어서 메서드를 나누고, 프로그램의 구조를 단순화시키는 것이 필수적이다.

 

 

* 메서드의 선언과 구현

메서드는 크게 선언부(header)와 구현부(body)로 이루어져 있다.

메서드의 선언과 구현과 관련한 것은 C언어의 함수 파트와 비슷해서 생략하도록 한다.

 


[생성자]

* 생성자란?

생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.

인스턴스 변수의 초기화 작업에 주로 사용된다.

 

생성자도 매서드처럼 클래스 내부에 선언되고, 구조도 메서드와 비슷하다.

그러나 생성자는 리턴값이 없다. 그렇다고 해서 void를 사용하지는 않는다.

 

 

- 생성자의 조건

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

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

(생성자도 메서드이기 때문에 앞에 void를 붙여야 하지만, 모든 생성자가 리턴값이 없기 때문에 void를 생략할 수 있게 한 것이라고 한다)

 

하나의 클래스에 여러 개의 생성자가 존재할 수 있다.

연산자 new가 인스턴스를 생성하는 것이지, 생성자가 인스턴스를 생성하는 것은 아니다.

생성자는 단순히 인스턴스 변수의 초기화에 사용되는 특별한 메서드일 뿐이다.

 

 

* 기본 생성자

컴파일러는 아래와 같은 간단한 '기본 생성자(default constructor)'를 제공하기 때문에, 클래스에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있다.

클래스 이름() {}
Card() {}

컴파일러가 자동적으로 기본 생성자를 추가해주는 경우는 클래스 내부에 생성자가 하나도 없을 때 뿐이다.

 

 

* 매개변수가 있는 생성자

생성자도 메서드처럼 매개변수를 선언하고, 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다.

인스턴스마다 각각 다른 값으로 초기화되어야 하는 경우가 많아서, 매개변수를 사용한 초기화는 유용하다.

Class Airpods {
	String color;	// 색상
    String generation;	// 세대 - first, second, third
    int order;	// 주문 개수
    
    Airpods() {}	// 생성자
    Airpods(String c, String g, int o) {
    color = c;
    generation = g;
    order = o;
    }
}

Airpods인스턴스를 생성할 때 생성자 Airpods()를 사용한다면, 인스턴스를 생성한 후 인스턴스 변수들을 따로 초기화 해줘야 한다.

매개변수가 있는 생성자 Airpods(String color, String generation, int order)를 사용하면 인스턴스를 생성하는 동시에 원하는 값으로 초기화 할 수 있다.

 

 

* 생성자에서 다른 생성자 호출하기 - this(), this

- 생성자 간에 서로 호출이 가능할 조건

1. 생성자의 이름으로 클래스 이름 대신 this를 사용할 것

2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능함

 

Airpods (String color) {	// 첫번째 줄
	order = 100;	// 에러 1. 생성자의 두번째 줄에서 다른 생성자 호출
    Airpods(color, "first", 4);	// 에러 2. this(color, "first", 4);로 해야함
}

 

Airpods (String color, String generation, int order) {
    this.color = color;
    this.generation = generation;
    this.order = order;
}

생성자의 매개변수로 선언된 변수의 이름이 인스턴스 변수의 이름과 같을 경우, 인스턴스 변수 앞에 this를 붙여주면 구분이 가능하다.

그러면 this.color은 인스턴스 변수이고, color은 생성자의 매개변수로 정의된 지역변수다.

this.color = color가 아니라 color = this.color로 하면, 둘 다 지역변수로 인식된다.

 

this는 '참조변수'이고, this()는 '생성자'이다.

728x90