📚
클래스, 메소드, 변수, 인스턴스, 객체
May 27, 2023
클래스
클래스란 객체를 정의해 놓은 것이며, 객체를 생성하는데 사용된다. 클래스를 잘 만들어 놓으면 객체를 생성할 때마다 고민을 할 필요가 없으며, 만들어 놓은 클래스로부터 객체를 생성해서 사용하기만 하면 된다.
우리는 JDK에서 제공하는 클래스들을 이용해서 쉽게 프로그램을 작성할 수 있다.
클래스의 또 다른 정의
- 데이터와 함수의 결합 함수와 데이터는 관계가 깊기 때문에 자바에서는 변수와 함수를 하나의 클래스에 정의하여 관계가 깊은 변수와 함수를 함께 다룰 수 있게했다.
- 사용자 정의 타입 사용자 정의 타입은 사용자가 기능 동작을 위한 데이터와 함수를 묶어서 정의하는 것이다.
객체
객체는 클래스의 정의된 내용대로 메모리에 생성된 것이다. 클래스로부터 객체를 만드는 것을 클래스의 인스턴스화라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다. 객체는 포괄적인 의미를 가지고 있다면, 인스턴스는 객체보다 구체적인 의미인 어떤 클래스로부터 만들어진 것인지를 강조하고 있다.
인스턴스의 생성과 사용
Tv t; //Tv클래스 타입의 참조변수 t를 선언, 메모리에 참조변수 t를 위한 공간이 마련된다. 아직 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 할 수 없다.
t = new Tv(); //연산자 new에 의해서 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 대입연산자 = 에 의해서 생성된 객체의 주소값이 참조변수 t에 저장된다. 이제 참조변수 t를 통해서 인스턴스에 접근할 수 있다.
변수
변수의 종류를 결정짓는 중요한 요소는 변수의 선언된 위치!
멤버변수
클래스변수 : 클래스가 메모리에 로딩될 때 생성되어 프로그램이 종료될 때 까지 유지된다.
- 인스턴스 변수 앞에 static을 붙이면 되고, 인스턴스를 생성하지 않아도 언제든지 사용이 가능하다.
- 모든 인스턴스가 공통된 저장공간을 공유하게 되므로 모든 인스턴스들이 공통적으로 값을 유지해야하는 경우 사용해야 한다.
인스턴스변수 : 클래스 영역에 선언되며, 인스턴스를 생성할 때 만들어진다.
- 인스턴스는 독립적인 공간을 가지므로 서로 다른 값을 가질수 있기 때문에 각각 고유한 상태를 유지해야하는 속성의 경우 인스턴스 변수로 선언한다.
지역변수
- 메소드 내에 선언되어 메소드내에서만 사용 가능하며, 메소드가 종료되면 소멸되어 사용할 수 없게된다.
변수의 초기화
멤버변수와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다.
멤버변수의 초기화 방법
1. 명시적 초기화
변수를 선언과 동시에 초기화 하는 것
int door = 4; //기본형 변수의 초기화
Engine e = new Engine(); //참조형 변수의 초기화
2. 초기화 블럭
- 클래스 초기화 블럭 : 클래스가 메모리에 처음 로딩될 때 한번만 수행
- 인스턴스 초기화 블럭 : 인스턴스를 생성할때마다 수행
class InitBlock{
static { /* 클래스 초기화 블럭 */ }
{ /* 인스턴스 초기화 블럭 */ }
}
3. 생성자
인스턴스 변수의 초기화
멤버변수의 초기화 시기와 순서
클래스 변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다.
인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.
클래스 변수의 초기화 순서 : 기본값 → 명시적 초기화 → 클래스 초기화 블럭
인스턴스 변수의 초기화 순서 : 기본값 → 명시적 초기화 → 인스턴스 초기화 블럭 → 생성자
메소드
특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
메소드를 사용하는 이유
- 높은 재 사용성
- 중복된 코드의 제거
- 프로그램의 구조화
인자와 매개변수
인자 : 메소드를 호출할 때 괄호 안에 지정해준 값 매개변수 : 메소드에 사용되는 변수
클래스 메소드
- static이 붙어있는 메소드
- 인스턴스를 생성하지 않아도 사용할 수 있으며 인스턴스 변수는 사용할 수 없다.
- 메소드내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
인스턴스 메소드
- 인스턴스를 생성해야만 호출이 가능하며, 인스턴스 변수를 사용할 수 있다.
class MyMath2 {
long a, b;
// 인스턴스변수 a, b만을 이용해서 작업하므로 매개변수가 필요없다.
long add(){
return a + b; // a, b는 인스턴스변수
}
// 인스턴스변수와 관계없이 매개변수만으로 작업이 가능하다.
static long add(long a, long b){
return a + b; // a, b는 지역변수
}
}
class MyMathTest2 {
public static void main(String args[]) {
// 클래스메소드 호출. 인스턴스 생성없이 호출가능
System.out.println(MyMath2.add(200L, 100L));
MyMath2 mm = new MyMath2(); // 인스턴스를 생성
mm.a = 200L;
mm.b = 100L;
// 인스턴스메소드는 객체생성 후에만 호출이 가능함.
System.out.println(mm.add());
}
}
클래스 멤버와 인스턴스 멤버간의 참조와 호출
- 같은 클래스에 속한 멤버(메소드, 변수)들은 별도의 인스턴스를 생성하지 않고도 참조 또는 호출이 가능하다.
- 인스턴스 멤버간의 호출 : 하나의 인스턴스 멤버가 존재한다는 것은 인스턴스가 이미 생성되어 있다는 것을 의미하며, 다른 인스턴스 멤버도 존재한다는 의미로 참조, 호출시 문제가 없음
- 인스턴스 멤버에서 클래스 멤버를 호출 : 클래스 멤버는 언제나 참조, 호출이 가능하기 때문에 문제가 없음
- 클래스 멤버에서 인스턴스 멤버를 호출 : 클래스 멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있기 때문에 문제 발생
- 같은 클래스내에서 클래스 멤버가 인스턴스 멤버를 참조, 호출해야 하는 경우는 드물며 이런 경우가 발생한다면 인스턴스 메소드로 작성해야할 메소드를 클래스 메소드로 작성한것은 아닌지 더 생각해봐야 함