클래스
클래스와 객체
- 클래스 - 객체를 생성하기 위한 설계도 (Class)
- 객체 - 클래스를 구체화하여 값으로 생성된 것(Object, instance)
- 클래스를 객체로 만드는 과정 - Instanciation 라고 함
클래스의 구성
class Car{ // 클래스 이름은 보통 PascalCase로 적는다.
int speed = 0; // 속성 = 멤버 변수
// 속성 : attribute, filed
// 멤버 변수 : member variable
// 같은 개념이지만 컨텍스트에 따라 다르게 부르기도 함 그래서 용어를 익숙하게 알아야함
void move() { // 메소드 (method), (가끔 멤버 함수라고 부르는 사람도잇음), (가끔 함수, 메서드가 더정확한 표현)
speed = 10; // 행위를 구현, 주로 속성을 변경하는 역할
}
}
- 클래스는 class 클래스명으로 생성할 수 있음
- 클래스는 속성(=멤버 변수), 메서드로 구성됨
객체의 생성
public class Main {
public static void main(String[] args) {
Car carOne = new Car(); // new 키워드로 클래스에서 객체 생성(Instanciation)
// 생성방법 : 자료형은 클래스명 변수명은 camelCase = new 클래스명();
System.out.println(carOne.speed);//0// .으로 속성 접근 가능
carOne.move();
System.out.println(carOne.speed);//10 // move()메서드가 속성을 변경함
Car carTwo = new Car();
System.out.println(carTwo.speed); // 0 // carOne과는 독립적인 객체로 존재함
Car carThree = carOne; // 참조형 객체 (가르키는 객체)
System.out.println(carThree.speed); //10//carThree는 new하지 않았으니 새로운 객체가 생긴 것이 아님
carThree.speed = 5;
System.out.println(carThree.speed);//5
System.out.println(carOne.speed);//5 carThree가 가르키는 carOne의 값이 바뀐 것이 었음!
//carThee와 carOne은 다른 변수이지만 같은 값을 가르키고 있다.
// String은 immutable이기에 참조형 객체이어도 이런 문제가 없다.(수정이 불가하기 때문에)
// 그러나 보통 class는 mutabl이기 떄문에 신경써서 사용해야 함
- new키워드를 통해 인스턴스를 생성할 수 있음
- 같은 클래스라도 new클래스로 생성한 만큼의 독립된 인스턴스(객체)가 생성됨
- .으로 해당 객체의 속성에 접근 가능
클래스와 객체의 메모리 구조
클래스 영역 ( Class area, method area, code area, static area)
- field 정보, method 정보, type 정보, constant pool
스택 영역(Stack area)
- method 호출 시 선언된 로컬 변수 (임시로 있다가 사라짐)
힙 영역 (Heap area)
-new 키워드로 생성된 객체(객체의 속성(멤버 변수))- garbage collection(GC)이 동작하는 영역
: 더이상 사용하지 않는 메모리를 알아서 변환하는 JVM의 기능
- garbage collection(GC)이 동작하는 영역
// 메모리 구조 예시
public class MemoryStructure {// 클래스 영역
int x, y; // 힙 영역(new 키워드로 생선된 객체에 속한 변수로 생성됨)
// int x,y의 값은 값이 실제로 힙영역에 메모리가 생성되서 그 값을 담게됨
String string = "String!!!"; // 힙 영역(변수자체는 힙영역에 생성), 상수풀("String!!!"은 상수풀에 생성)
// string은 클래스이기 때문에 값을 생성하는게 아닌 상수풀에 잡힌 값을 참조하는 참조값이 담기게 됨
public void method(int value) {// 클래스 영역'
// int value => 스택 영역 //
char c = 'w'; // 스택 영역
} // 메서드 사용시에 임시로 스택영역에 메모리가 할당되고 메서드 사용 후에 사라지는 영역(지역 변수)
// 참고 : 주소값을 몇bit로 쓰느냐에 따라 32-bit, 64-bit으로 나뉨, 근데 요즘은 대부분 64-bit os를 쓰기 때문에 대부분 64bit
// 메모리 주소를 몇 bit를 쓰느냐에 따라 운영체제가 32-bit 64-bit나뉘고 ram을 4gb이상쓰기위해 64bit os가 주를 이룸
- 로컬 변수와 같이 파라미터 로컬 변수(입력인자) 또한 스택영역에 생성되었다가 메서드 사용 후 메모리에서 사라짐
- 메서드에서 생성된 객체의 경우 힙영역에 메모리가 생성되지만 메서드 사용후 G.C에 의해 정리됨
변수 (Variables)
- 클래스 멤버 변수 (static variable, class variable)
- 인스턴스 멤버 변수 (member variable, attribute, ..)
- 로컬 변수 (local variable)
- 로컬 파라미터 변수 (local parameter variable) (arguments)
// 클래스에서 변수 생성
public class Variables {
static int classVar; // static 자료형 변수명; // 클래스 멤버 변수, 스태틱 변수(정적 변수)
int instanceVar; // 인스턴스 멤버 변수, 필드, 속성
public void method(int paramVar) { // paramVar : 로컬 파라미터 변수
System.out.println(paramVar);
int localVar; // 로컬 변수 // 메서드 안에 속하는 로컬 변수
//System.out.println(localVar); // localVar은 0으로 초기화 안되서 바로 출력 불가
localVar = 10; //메서드 안에서 자유롭게 접근가능
System.out.println(localVar); // 값 대입 후에는 출력가능
{
localVar = 30; // 메소드 안에 {}에서도 접근 가능
int localVar2 =20;
}
System.out.println(localVar); // 블록 내에서 수정한 것도 반영됨
// locaVar2 =40;// {}밖에서 접근 불가, 생명주기가 끝났다. Life-Cycle 끝났다.
}
}
- 클래스 변수, 멤버 변수는 0으로 초기화 되고 지역변수는 초기화 되지 않음
- 로컬 변수는 메서드 안에서 생성되지만 메서드 내에서도 {}으로 사용 지역 정해짐
- {}안에서 생성된 변수는 {}안에서 생애가 끝남..
- {}밖에서 생성된 변수는 {}안밖을 오가도 상관 없음.
// 각 변수에 대한 접근
class variableTest{
public static void main(String[] args){
System.out.println("클래스 변수"); // 클래스에 속하기에 인스턴스 만들지 않아도 존재// 특이 케이스
System.out.println(Variables.classVar);//0 으로 초기화됨 => 어떤 변수는 초기화 하지 않아도 자동으로 된다는 것은 특이한케이스
// 클래스 변수는 0으로 초기화 된다!!
/// 클래스 변수는 클래스 이름으로 바로 접근 가능
Variables.classVar = 10;
System.out.println(Variables.classVar);//10
System.out.println("");
System.out.println("인스턴스 멤버 변수");
Variables var = new Variables();
System.out.println(var.instanceVar);//0 // 인스턴스 변수도 0으로 초기화됨 - 특이 케이스
//Variables.instanceVar // 접근 불가능, 인스턴스 만들어야 객체(실체)가 생기기 때문
var.instanceVar = 20;
System.out.println(var.instanceVar);//20
System.out.println("");
Variables var2 = new Variables();
System.out.println(var2.instanceVar); // 0// 0으로 초기화된 새로운 객체 생성
// System.out.println(var2.classVar);//10// 인스턴스로도 클래스변수에 접근 가능, but 이러한 접근은 권장되지 않음
// 클래스명으로해서 클래스전체에 속한 변수라는 것을 명확히 하며 사용하라는 뜻
System.out.println("");
//Variables.method(); // 잘못된 접근, 객체로 접근해야함
var.method(9);
// System.out.println(var.method(9)); //return값이 있어야 가능함
}
}
- 클래스 변수는 인스턴스 생성하지 않아도 접근가능 하지만 이외에 변수에 접근하기 위해서는 인스턴스 생성해야 함
- 객체로도 클래스 변수에 접근 가능하지만 클래스명으로 접근하는걸 권장(클래스 변수라는걸 구분하기 위함)
- ex) Variabls.method();
'Java' 카테고리의 다른 글
[Java] 3_2_3_클래스 & 메서드 예제 (0) | 2020.08.10 |
---|---|
[Java] 3_2_2_클래스 - 메소드 (0) | 2020.08.09 |
[Java] 3_1_객체지향 프로그래밍(O.O.P.) (0) | 2020.08.05 |
[Java] 2_9_문자열(String) & 예제 (0) | 2020.08.05 |
[Java] 2_8_2_배열, 다차원 배열 예제 (0) | 2020.08.04 |