Java class(클래스)와 Object(객체)
▶ 클래스(설계도)란
- 객체를 정의해 놓은 것. 객체의 틀.(설계도)
- 데이터와 함수의 결합이다.
- 사용자 정의 타입이다.
▶ 객체(제품)란
- 실제로 세상의 모두 존재하는것. 모든 사물.
- 클래스로부터 생성(new)된다.
- 생성된 객체를 인스턴스라고한다. (ex: Car인스턴스)
- 객체들은 독립체로 존재한다.
▶ 객체의 구성요소(메서드)
- 객체가 가지고 있는 기능과 속성.
- 어떤 동작을 나타내는 것
클래스(틀) | 객체(제품) | 객체의 기능(메서드)과 속성(변수) |
자동차 설계도 | 자동차 | 속성: 운전대, 브레이크, 기어, 색상, 베기량 등. 기능: 뒤로가기 앞으로가기, 멈추기 등. |
TV 설계도 | TV | 속성 : 크기, 색상, 볼륨, 채널 기능: 켜기, 끄기, 볼륨 업다운, 채널 |
▶ 인스턴스화
- 클래스를 객체(인스턴스)를 생성(new)하는것을 인스턴스화라고 한다.
▶ 인스턴스 변수
- 클래스 내에 있는 변수를 인스턴스 변수라고 한다.
▶ 클래스 사용방법
1. 클래스 작성
① 패키지(폴더 개념으로 생각하면 좋다.)
- 패키지를 만들어두면 클래스를 만들면 위에 자동으로 해당 패키지가 작성되어 있다.
② 클래스
- 파일 이름과 클래스 이름이 일치해야 한다.
- 클래스명 첫 글자는 대문자로 해야 한다.
③ 생성자(constructor)
- 반환 값이 없고 클래스명과 일치해야 하고 객체가 생성될 때 new와 함께 호출된다.
- 객체가 생성될때 변수나 상수를 초기화하거나 다른 초기화 기능을 수행하는 메서드를 호출한다.
- 대부분 생성자는 외부에서 접근 가능하지만 필요에 의해서 private로 선언될 때도 있다.
- 기본 생성자(default constructor)
- 클래스에는 반드시 하나이상의 생성자가 존재한다.
- 클래스에 생성자를 구현하지 않아도 new키워드와 함께 생성자를 호출할 수 있다.
- 클래스에 생성자가 하나도 없는 경우 컴파일러가 생성자 코드를 넣어준다.
- 매개변수가 없고 구현부가 없다.
- 생성자 this()
- 생성자에서 다른 생성자 호출할때 사용. (2번생성자와 3번생성자가 1번생성자를 호출)
- 다른 생성자 호출할때 첫 줄에서만 사용가능하다.(두번째줄도 작성하면 오류가난다.)
package com.javalec.makeClass; //만든 패키지
public class CarClass{ //클래스
String color; //인스턴스변수, car인스턴스의 멤버변수
static int number; //클래스변수(static변수, 공유변수)
int door; //문의개수
public CarClass(){ //생성자 : 클래스명과 동일한데 클래스가 처음 생성될때 호출된다.
//기본생성자(default constructor)이다.
} //메인메서드에서 CarClass car= new CarClass();치면 객체 생성이된다.
publci CarClass(String color, int door){ //생성자 1번
this.color = color; //참조 변수 this
this.door = door; //this.변수는 인스턴스변수이고 this가 붙지않는것은 지역변수
}
public CarClass(){ //생성자 2번 //2번과3번은 this로 써서 1번을 호출한다.
this("red", 4); //publci CarClass(String color, int door) 호출하는거와 같다.
} //다른생성자 호출할때 첫줄만 사용가능하다.
public CarClass(String color){//생성자 3번
this(color, 4);
}
public CarClass(){ this로 아무것도 지정해주지않으면 color, door는 디폴트값이 도니다.
color="red";
door=4;
}
public void handleLeft(){ //운전대 왼쪽 메서드
}
}
④ 변수
- 클래스 변수(Class Variable) : 클래스 영역, 클래스가 메모리에 올라갔을 때 생성된다. 객체 생성이 필요 없다.
클래스가 처음 로딩될 때 단 한번 초기화 된다.
- 인스턴스 변수(Instance Variable) : 클래스 영역, 인스턴스가 생성 되었을 때 생성된다. 객체 생성이 필요하다.
생성되면 자동으로 0으로 초기화된다. 생성될때마다 초기화된다.
-참조변수 this
- 인스턴스 자신을 가리키는 참조변수, 인스턴스 주소가 저장된다.
- 인스턴스 메서드(생성자포함)에서 사용가능
- 지역변수(lv)와 인스턴스변수(iv)를 구별할 때 사용한다.
- 지역 변수(local Variable) : 메서드 영역. 변수 선언문이 수행되었을 때 생성된다. 수동으로 초기화를 시켜야함
2. 객체 생성(instance)
- 클래스명 변수명 = new 클래스명();
- 클래스명 변수명: 클래스의 객체를 참조하기 위한 참조 변수를 선언
- new 클래스명 : 클래스 객체(인스턴스)를 생성(new 키워드를 사용하여 인스턴스 생성)하고 변수에 대입하면 객체 주소를 참조 변수에 저장
3. 객체의 사용
클래스 내에 메서드가 작성이 되면 메인 메서드에 객체 생성한 후
객체변수명.메서드()로 호출할 수 있다.
Carclass car= new Clarclass();
car.color=red; //car인스턴스의 멤버변수 color는 red로 한다
car.handleLeft(); //car인스턴스의 메서드 handleLeft()을 호출한다.
▶ 힙 메모리(heap memory, 동적 메모리)
- 생성된 인스턴스는 동적 메모리에 할당된다.
- C나 C++은 주기적으로 개발자가 사용한 메모리를 해제해야 하지만 Java에서는 가비지 컬렉터가 자동으로 사용하지 않는 메모리를 수거해간다.
- 하나의 클래스로부터 여러 개의 인스턴스가 생성되고 각각 다른 메모리 주소를 가지게 된다.
▶ 하나의 소스파일에 여러 클래스 작성
- 소스파일 이름과 여러 클래스 중 하나는 클래스 이름과 일치해야 하고 public class가 붙어있어야 한다.
- 둘 이상의 public class가 존재하면 안 된다.
- public class가 존재하지 않으면 소스파일의 이름과 여러 클래스 중 클래스 이름이 하나만 같으면 된다.
- 대소문자를 구분하기 때문에 대소문자까지 일치해야 한다.
▶ 객체 배열
객체 배열(참조 변수 배열)
Car car1, car2, car3; 을 Car[] carArr=new Car[3]; 하면 객체가 생성해서 배열의 각 요소에 저장된다.
CarArr[0]=new Car();
CarArr[1]=new Car();
CarArr[2]=new Car();
//Car[] carArr=new Car[3]; 로 참조 변수 배열을 선언하면 객체(CarArr[0]=new Car();)를 넣어줘야한다.
Car[] carArr=new Car[3]; 와 CAr[] carArr={new Car(), new Car(), new Car()}; 이렇게 표현 가능하다.
참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수
참조 값 : 생성된 인스턴스의 메모리 주소 값