자바의 정석 ch6 정리
클래스 정의 : 객체를 정의해놓은 것 or 객체의 설계도 또는 틀
클래스 용도 : 객체를 생성하는데 사용되고,객체는 클래스에 정의된 대로 생성됨.
객체의 정의 : 실제로 존재하는 것, 사물 또는 개념
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다르다.
클래스로부터 객체를 만드는 과저을 클래스의 인스턴스화라고 한다.
클래스 -------> 인스턴스(객체)
이 과정을 "인스턴스화" 라고 부른다.
EX ) TV
속성 - 크기, 길이 , 높이, 생상, 볼륨, 채널
기능 - 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기
code
class Tv {
String color; // 색깔
boolean power;
int channerl;
boid power(){
if(power)
power = false;
else
power = true;
}
void channelUp(){
channel++;
}
void channelDown(){
channel--;
}
}
class TvTest {
public static void main(String args[]) {
Tv t;
t = new Tv();
t.channel = 7;
t.channelDown();
System.out,println("현재 채널은 " + t.channel + " 입니다,");
}
1. Tv t;
: Tv클래스 타입의 참조변수 t를 선언한다. 그러면 메모리에 참조변수 t를 위한 공간이 마련된다.
아직 인스턴스가 생성되지 않은 상태이다.
2. t = new Tv();
: 연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성된다.
멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다.
1. 변수 - 하나의 데이터를 저장할 수 있는 공간
2. 배열 - 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
3. 구조체 - 서로 관련된 여러 데이터를 종ㄹㅍ에 관계없이 하나의 집합으로 저장할 수 있는 공간.
4. 클래스 - 데이터와 함수의 결합
변수 ---> 배열 ---> 구조체 ---> 클래스 (구조체 + 함수)
1. 인스턴스 변수 (instance variable)
: 클래스 영역에 선언되고, 클래스의 인스턴스를 생성할 때 만들어진다. 각각의 인스턴스 변수들은 독립적인 저장공간을 가지기 때문에 인스턴스마다 서로 다른 값을 가질 수 있다.
2. 클래스 변수 (class variable)
: 클래스 변수를 선언하는 방법은 인스턴스변수 앞에 static을 붙이기만 하면 된다. 인스턴스마다 독립적인 저장공간을 갖는 인스턴스 변수와는 달리, 클래스 변수는 모든 인스턴스가 공통된 저장공간을 공유하게 된다.
즉, 클래스변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유하게 된다. 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우, 클래스변수로 선언해야한다.
클새스 변수는 인스턴스 변수와 달리 인스턴스를 생성하지 않고도 언제라도 바로 사용가능하다.
"클래스이름.클래스변수"와 같은 형식으로 사용하면된다.
클래스가 메모리에 로딩(loading)될 때, 생성되어 프로그램이 종료될 때 까지 유지된다.
3. 지역 변수 (local variable)
: 메서드 내에 선언되어 메서드 내에서만 사용이 가능하다. 메서드가 종료되면 소멸된다.
다음과 같이 카드 게임에 사용되는 카드를 클래스로 정의 해보았다.
카드의 속성 : 무늬, 숫자, 폭 높이
이 중에서 어떤 속성을 클래스 변수로 지정하고 어떤 속성을 인스턴스 변수로 지정할 것인지에 대해서 생각해보면 다음과 같이 나눌 수 있다.
Class Card {
String kind; // 무늬
int number; // 숫자
static int width = 100; // 폭
static int height = 250; // 넓이
카드의 size는 어떤 카드든지 동일하기 때문에, 클래스 변수로 선언을 할 수 있다.
: 메서드를 구현할 때, 가장 먼저 해야하는 일은 매개변수의 값이 적절한 것인지 확인하는 것이다. 만약, 메서드를 작성하는 사람이 호출하는 쪽에서 알아서 적절한 값을 넘겨주겠지라고 생각하면 절대 안된다.
메서드는 타입만 맞으면 어떤 값도 매개변수를 통해 넘어오는게 가능하기 때문에, 가능한 경우 모든 경우의 수에 대해 고민하고 그에 대비한 코드를 작성해야한다.
따라서 적절하지 않은 값이 매개변수를 통해 넘어온다면, 매개변수의 값을 보정하던가 보정하는 것이 불가능하다면 return문을 사용해 작업을 중단하고 호출한 메서드의 위치로 돌아가야한다.
EX ) divide by 0
1. 메서드 영역(method area)
: 프로그램 실행 중 어떤 클래스가 사용이되면, JVM은 해당 클래스의 클래스파일(.class)을 읽어서 클래스에 대한 정보(클래스 data - 클래스 메서드 & 클래스 변수)를 메서드 영역에 저장한다.
2. 힙 (Heap)
: 인스턴스가 생성되는 공간, 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에서 생성이된다. 즉, instance 변수들이 생성되는 곳이다.
3. 호출 스택 (Call stack or execution stack)
: 메서드 작업에 필요한 메모리 공간을 할당한다. 메서드가 호출되면 Call stack에 호출된 메서드를 위한 메모리가 할당이되고, 메서드가 종료되면 할당되었던 메모리 공간이 반환된다.
Call stack의 제일 위에 있는 메서드는 현재 실행중인 메서드이다.
아래에 있는 메서드가 바로 위의 베서드를 호출한 메서드이다.
항상 제일 먼저 Call stack에 저장되는 메서드는 main이다.
: class varialbe과 마찬가지로 method선언부에 "static"만 붙이면 class method가 된다. 클래스 변수와 마찬가지로 객체를 생성하지 않고서 "클래스이름.메서드이름(매개변수)"와 같은 식으로 호출이 가능하다.
인스턴스와 관계가 없는 메서드들을 Class Method로 선언한다.
여기서 "인스턴스와 관계가 없는 메서드"들은 내부에 인스턴스 변수나 인스턴스 메서드를 사용하지 않는다는 것을 뜻한다.
: 인스턴스 변수와 메서드는 클래스의 변수와 메서드를 참조 또는 호출이 가능하지만, 역은 불가능하다
-> 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만. 클래스멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있기 때문.