클래스 정의 : 객체를 정의해 놓은 것
클래스 용도 : 객체를 생성
객체 정의 : 실제 존재, 사물 또는 개념
객체 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
먼저 클래스를 작성한 다음, 클래스로부터 객체를 생성하여 사용
인스턴스(instance) : 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라 한다.
객체 속성(property) : 멤버변수, 특성, 필드, 상태
객체 기능(function) : 메서드, 함수
ex)
속성 -> 멤버변수
기능 -> 메서드
ex)
클래스명 변수명;
변수명 = new 클래스명();
Tv t; 클래스의 객체를 참조하기 위한 !참조변수선언!
t = new Tv(); 클래스의 객체 생성 후, !객체의 주소를 참조변수에 저장!
Tv t1 = new Tv(); Tv t2 = new Tv(); t2 = t1; // t1이 저장하고 있는 값(주소)을 t2에 저장한다. // 그렇게 되면 t2역시 t1이 참조하고 있던 인스턴스를 같이 참조하게 되어 t2가 원래 참조하고 있던 인스턴스는 더이상 사용할 수 없다 // 카비지 컬렉터에 의해서 자동적으로 메모리에서 삭제된다. // 자신을 참조하고 있는 참조변수가 하나도 없는 인스턴스는 더이상 사용되어질 수 없다.
class Variables
{
int iv; // 인스턴스 변수
static int cv; // 클래스 변수(공유 변수)
void method()
{
int lv = 0; //지역변수
}
}
클래스 변수
-> 인스턴스 변수와는 달리 인스턴스를 생성하지 않고도 언제라도 바로 사용가능
'클래스이름.클래스변수' ex) Variables.cv 와 같은 형식으로 사용
클래스가 메모리에 로딩 될 때 생성되어 종료까지 유지되며, public을 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 '전역변수'의 성격을갖는다
'메서드' 는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
- 높은 재사용성(ex. Java API)
- 중복코드 제거
- 프로그램의 구조화
*메서드 정의 : 선언부, 구현부 작성
반환타입 메서드이름 (타입 변수명, 타입 변수명, ..)
int add(int a, int b)
{
int result = a+b;
return result;
}
*return문
메서드 반환타입이 'void'가 아닌 경우 구현분에 'return'이 반드시 포함되어야한다.
반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다.
3가지 주요 영역
1. 메서드 영역 : 어떤 클래스가 사용되면, JVM은 해당 클래스(*.class)파일을 읽어서 저장
이 때, 그 클래스의 클래스변수도 함께 생성된다.
2. 힙 : 인스턴스들이 생성되는 공간
3. 호출스택 : 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 비워진다.
첫 번째로 호출된 메서드 동작도중 다른 메서드가 들어오면 첫 번째 호출된 메서드는 수행을 멈추고,
두 번째 메서드가 수행된다. 동시에 첫 번쨰 메서드위에 두 번째 메서드가 쌓인다.
두 번째 메서드 수행이 끝나면 다시 첫 번째 메서드가 수행된다.
메서드 수행이 끝나면 스택에서 제거되며 메모리를 반환한다.
기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.
매서드의 내부에서 매서드 자신을 다시 호출하는 것
void method() {
method();
}
void method(int n){
if(n ==0)
return;
syso(n);
mehtod(--n);
}
재귀호출은 무한하게 자기 자신을 호출하기 때문에 조건문이 따라다닌다
반복문으로 구현할 수 있지만 논리적 간결함 때문에 사용하는 경우가 많다
반복문에 비해 속도가 느리다 -> 코드가 복잡해지면 간결함이주는 큰 이득을 위해 사용
클래스 메서드 : 인스턴스와 관계없는 메서드
인스턴스 메서드 : 메서드 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드
클래스 영역에 선언된 변수를 멤버변수라 한다. 멤버변수 중에 static 이 붙은 것은 클래스변수
붙지 않은 것은 인스턴스변수라 한다. 멤버변수는 둘다 통칭하는 말이다.
설계
1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
2. 캘래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
*static이 붙은 변수는 클래스가 메모리에 올라갈 떄 이미 자동적으로 생성
3.클래스 메서드는 인스턴스 변수를 사용할 수 없다.
4.메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
- 메서드 호출시간이 짧아지므로 성능향상 인스턴스메서드는 실행 시 호출되어야할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.
인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상존재 -> 클래스파일을 읽을 때 먼저 생성됨
결국 클래스멤버 호출때는 인스턴스 멤버가 존재하지 않을 수도 있다.
인스턴스멤버간의 호출은 문제가없다. 하나의 인스턴스멤버가 존재하는 것은 다른 인스턴스멤버들도 모두 존재하기 때문이다.
한 줄로