새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 오동작을 방지할 수 있다.
class Variables{
int iv; // 인스턴스 변수
static int cv; // 클래스 변수(static변수, 공유 변수)
void method(){
int iv = 0; // 지역변수
}
}
클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다.
인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.
클래스 변수는 인스턴스변수 앞에 static을 붙이기만 하면 된다.
클래스 변수는 모든 인스턴스가 공통된 저장공간을 공유하게 된다.
클래스 변수는 인스턴스 변수와 달리 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있다.
클래스가 메모리에 로딩될 때 생성되어 프로그램이 종료될 때까지 유지되며, public을 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 '전역변수'의 성격을 갖는다.
메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸되어 사용할 수 없게 된다.
한 번 만들어 놓은 메서드는 몇 번이고 호출할 수 있으며, 다른 프로그램에서도 사용이 가능하다.
같은 코드를 여러 곳에 반복되는 문장들 대신 메서드를 호출하는 한 문장으로 대체할 수 있다.
코드의 중복이 제거되고, 변경사항이 발생했을 때 메서드만 수정하면 되므로 관리가 용이하다.
작은 프로그램을 작성할 때는 상관없지만 규모가 커지면 몇 만 줄이 넘는 코드를 일일히 작성할 수 없다.
규모가 큰 프로젝트에서 문장들을 작업단위로 나눠서 여러 개의 메서드에 담아 프로그램 구조를 단순화시킬 수 있다.
한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '오버로딩'이라 한다.
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
반환타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.
만약 메서드도 변수처럼 이름만으로 구별된다면, 한 클래스내의 모든 메서드들은 이름이 달라야한다.
이는 이름을 짓는 것도, 사용하는 쪽에서 사용할 메서드를 일일이 기억하는 것도 어렵게 만든다.
오버로딩을 통하면 기억하기도 쉽고 하나의 이름으로 메서드 이름을 절약할 수 있어서 편리하다.
생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.
인스턴스 변수의 초기화 작업(인스턴스 변수 초기화)에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.
(1) 생성자의 이름은 클래스의 이름과 같아야 한다.
(2) 생성자는 리턴 값이 없다.
연산자 new가 인스턴스를 생성
Card c = new Card();
수행되는 과정
1. 연산자 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성된다.
2. 생성자Card()가 호출되어 수행된다.
3. 연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.
컴파일할 때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러가 자동적으로 기본 생성자를 추가하여 컴파일한다.
단 2가지의 조건을 만족해야 한다.
(1) 생성자의 이름으로 클래스이름 대신 this()를 사용한다.
*this()는 생성자, this는 참조 변수 둘은 다른 것이다.
(2) 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
Car(String color)
door = 5; // 첫번째줄
Car(color, "auto", 4);
// 에러1. 생성자를 두번째 줄에서 다른 생성자 호출
// 에러2. this(color, "auto", 4);로 해야함
다른 생성자를 첫 줄에서만 호출이 가능하도록 한 이유는 생성자 내에서 초기화 작업도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화 할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해 질 수 있기 때문이다.