[JAVA] # 08. 클래스와 객체
+ 클래스 : 객체를 정의해 놓은 것으로 객체를 생성할 때 사용
+ 객체 : 실제로 존재하는 것 (사물 또는 개념) / 객체의 속성과 기능에 따라 다르다. (?)
+ 인스턴스 : 객체는 인스턴스를 포함하는 일반적인 의미이며 인스턴스는 객체를 생성하는데 사용된다.
+ 인스턴스화 : 클래스로부터 인스턴스를 생성하는 것(메모리 공간을 잡아주는 것)
// 클래스를 인스턴스화 하면 객체가 됨
<<< 객체 >>>
- 객체는 속성과 기능으로 구성
속성은 변수로 기능은 메서드로 정의
인스턴스 생성 //
Tv myTv; //객체를 다루기위한 참조변수 선언
myTv = new Tv(); // 객체 생성 후, 생성된 객체의 주소를 참조변수에 저장
참조변수는 하나의 인스턴스만 가리킴; 하나의 인스턴스는 여러개의 참조변수를 가질 수 있음
<<메서드>>
반복적인 코드를 줄일 수 있음
코드 관리 용이
반복적으로 수행되는 여러문장을 메서드로 작성
하나의 메서드는 한 가지 기능만 수행하도록 작성
+ 클래스 영역 내에서만 작성 가능
- 반환값이 있는 경우 return 뒤에 반환값 써야 함
- 반환값 없는 경우 return; 만 쓰면 되는데 안써도 되던데?
<<this>>
인스턴스 자세를 가리키며 인스턴스의 주소가 저장됨
모든 인스턴스에 지역변수로서 자동 생성
인스턴스 변수와 지역
- 변수를 구분하기 위해 this사용
class Tv {
int x,y;
public void sing (int x, int y) {
this.x=x; //this.x는 이 메서드안의 지역변수 뒤의 x는 이 클래스의 인스턴스 변수
this.y=y;
}
}
- 클래스 밖에는 아무것도 선언할 수 없다. (변수 상수 메서드 전역변수 등등)
- main 메서드는 반드시 pubilc static 선언할 것
- 인스턴스변수는 자동으로 초기화됨 (int 0, float 0.0, boolean false, reference null)
/ /지역변수는 초기화 안됨
- 캡슐화를 위해서 인스턴스 변수는 보통 private로 선언하고
다른 클래스에서 변수에 접근할수 있는 메서드를 만들고 그 메서드를 public으로 선언
(다른 클래스가 직접적으로 인스턴스 변수에 접근못하게)
<<< 생성자 : 인스턴스 초기화 메서드 >>>
생성자 이름은 클래스와 동일
모든 클래스에는 반드시 하나 이상의 생성자가 필요
리턴 타입 없음 / 앞에 반환타입 쓰지마
Card c = new Card(); //()안이 비었으므로 default 생성자 부른 것임을 알 수 있다.
연산자 new에 의해 메모리(heap)에 Card클래스의 인스턴스가 생성
생성자 Card()가 호출되어 수행
연산자 new의 결과로 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장
클래스에 내가 정의한 생성자가 하나라도 있으면 default 생성자 자동 생성 안됨
# 생성자에서 다른 생성자 호출
– this() {같은 클래스의 다른 생성자 호출할 때 사용 / 생성자의 첫 문장에서만 호출 가능}
Tv() {
this(4, 5); //코드의 재사용성을 높임
}
Tv(int df, int gi){
x = df;
y = gi;
}
# 생성자를 이용한 인스턴스의 복사
생성자에서 참조변수를 매개변수로 받아서 인스턴스 변수들의 값을 복사
똑같은 속성값을 갖는 독립적인 인스턴스가 하나 더 만들어짐
Tv() {
this(4, 5); //코드의 재사용성을 높임
}
Tv(int df, int gi){
x = df;
y = gi;
}
Tv (Tv t) { //인스턴스의 복사를 위한 생성자
x = t.x;
y = t.y;
}
/////////////////////////////////이렇게하고
main에서 Tv tv1 = new Tv();
Tv tv2 = new Tv(tv1);
이렇게 하면 같은 속성을 가지는 인스턴스가 하나더 만들어짐
******물론 참조변수값은 다르다.
<<< 변수의 종류 >>>
클래스 영역 – 클래스변수 : 믈래스가 메모리에 올라갈 때 (클래스안의 static)
- 인스턴스 변수 : 인스턴스 생성시
메서드 영역 – 지역변수; 변수 선언문 수행 시
+ 클래스 변수(class variable)
• 같은 클래스의 모든 인스턴스들이 공유하는 변수
• 인스턴스 생성없이 ‘클래스이름.클래스변수명’으로 접근
• 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸
+ 인스턴스 변수(instance variable)
• 각 인스턴스의 개별적인 저장공간
• 인스턴스마다 다른 값 저장가능
• 인스턴스 생성 후, ‘참조변수.인스턴스변수명’으로 접근
• 인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 garbage collector에 의해 자동제거됨
+ 지역 변수(local variable)
• 메서드 내에 선언되며, 메서드의 종료와 함께 소멸
• 조건문, 반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸
//////////////////////////저장되는 메모리 위치 공부하기
<<<< 변수의 초기화 >>>>
멤버변수(인스턴스 변수, 클래스 변수)와 배열은 각 타입의 기본값으로 자동 초기화되므로 초기화 생략 가능
지역변수는 사용전에 반드시 초기화
$ 초기화 방법
명시적 초기화 ( int foor = 4; / Eng e = new Eng(); )
생성자 사용
초기화 블록 (인스턴스 초기화 블록 {}
- 모든 생성자에서 공통적으로 수행되는 작업에 사용 / 인스턴스 생성시마다 생성자보다 먼저 실행됨
/ 클래스 초기화 블록 static {} )
- 클래스 변수의 복잡한 초기화에 사용되며 클래스가 로딩될떄마다 실행됨
클래스 변수는 클래스가 처음로딩될떄 단 한번
인스턴스는 인스턴스 생성될때마다 생김
<<<<<메서드>>>>
+ 인스턴스 메서드
• 인스턴스 생성 후, ‘참조변수.메서드이름()’으로 호출
• 인스턴스변수나 인스턴스메서드와 관련된 작업을 하는 메서드
• 메서드 내에서 인스턴스변수 사용가능
• 객체마다 하나씩
+ 클래스 메서드 (static 메서드)
• 객체생성없이 ‘클래스이름.메서드이름()’으로 호출 //객체 생성전에 이미 생성되고 사용도 할 수 있음
• 인스턴스변수나 인스턴스메서드와 관련없는 작업을 하는 메서드
• 메서드 내에서 인스턴스변수 사용불가 //인스턴스 멤버(변수, 메서드)들 호출하면 에러남
• 메서드 내에서 인스턴스변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.
• 객체가 사라져도 존재하고 있으며 프로그램 종료될 때 사라짐
• 동일 클래스의 모든 객체들은 사용할 수 있음
• this사용 불가
<<<<<메서드 오버로딩>>>>>
하나의 클래스에 같은 이름의 메서드를 여러개 정의
+ 메서드의 이름이 같아야 한다.
+ 매개변수의 개수 또는 타입이 달라야 한다.
+ 리턴 타입은 관계 없다.