2021/01/24 - [Programming Language/Java] - [Java] 객체지향언어(1) | 클래스와 객체, 인스턴스, 객체 배열
[변수와 메서드]
* 선언 위치에 따른 변수의 종류
변수는 클래스 변수, 인스턴스 변수, 지역 변수 이렇게 세 종류가 있는데, 변수의 종류를 결정하는 중요한 요소는 '변수의 선언된 위치'이다.
지역 변수 : 멤버 변수를 제외한 나머지 변수
클래스 변수 : 멤버 변수 중 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()는 '생성자'이다.
'Programming Language > Java' 카테고리의 다른 글
[Java] 객체지향언어(3) | 제어자(modifier), 접근 제어자(access modifier) (0) | 2021.01.31 |
---|---|
[Java] 클래스(class) 문제 풀이 | 클래스(class)작성 예제, 엔클로징 인스턴스 오류 (1) | 2021.01.31 |
[Java] 객체지향언어(1) | 클래스와 객체, 인스턴스, 객체 배열 (0) | 2021.01.24 |
[Java] 배열(2) | String 배열, 다차원 배열 (1) | 2021.01.24 |
[Java] 배열(1) | 배열 선언, 생성, 초기화, 인덱스, 배열 길이, 배열 출력, 배열 복사, Array.toString (2) | 2021.01.18 |