👉🏻 이 글은 자바의 정석(3판) Chapter6을 공부하며 쓴 글입니다.
- '실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.'
- '코드의 재사용성이 높고 유지보수가 용이하다.'
클래스 : 객체를 정의해 놓은 것
--> 용도 : 객체 생성할 때 사용
객체 : 실제로 존재하는 것. 사물 또는 개념
== 클래스에 정의된 내용대로 메모리에 생성된 것
JDK(Java Development Kit)에서는 많은 수의 유용한 클래스(Java API)를 기본적으로 제공하고 있다.
클래스명 변수명; // 클래스 객체 참조를 위한 참조변수 선언
변수명 = new 클래스명(); // 객체 생성 후 참조변수에 저장
많은 수의 객체를 관리할 때, 배열로 다루면편리할 것이다.
- 객체 배열 안에는 객체의 주소가 저장된다.
- 객체 배열은 참조변수들을 하나로 묶은 참조 변수 배열인 것이다.
Tv tv1, tv2, tv3;
--> TV[] tvArr = new Tv[3];
길이가 3인 객체 배열을 위와 같이 생성하명, 각 요소는 참조변수의 기본값인 null로 자동 초기화 된다. 아직 객체가 저장되지 않은 상태이다.
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
// or
Tv[] tvArr = { new Tv(), new Tv(), new Tv() };
// or
Tv[] tvArr = new Tv[100];
for(int i=0; i<tvArr.length; i++){
tvArr[i] = new Tv();
}
"변수의 선언된 위치"
-> 클래스 변수(static 변수, 공유변수) , 인스턴스 변수(static X) , 지역 변수
인스턴스 변수 (instance variable)
클래스 영역 안에 선언.
인스턴스마다 서로 고유한 상태를 유지해야 하는 경우 선언.
인스턴스가 생성될 때 마다 생성된다.
클래스 변수 (class variable)
static (정적인, 고정적인, 클래스의, 공통적인)을 앞에 붙이면 됨.
클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유하게 된다.
한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성인 경우, 클래스 변수로 선언해야 한다.
지역 변수 (local variable)
메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 사용할 수 없게 됨. 선언된 블럭 {} 내에서만 유효.
.
특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.
반환타입 메서드이름 (타입 변수명, 타입 변수명, ...) {
//메서드 호출시 수행될 코드
}
매개변수 선언시 주의할 점은 두 변수의 타입이 달라도 생략할 수 없다는 것이다.
매개변수도 지역변수이다.
반환값이 없는 경우 반환타입으로 void를 적어야한다.
return문
이 값의 타입은 반환타입과 일치하거나 적어도 자동 형변환이 가능한것이어야 한다. 단 하나의 값만 반환 가능하다.
매개변수뿐만 아니라 반환값도 참조형이 될 수 있는데, 이 때 객체의 주소(정수값)이 반환된다.
지역변수 (local variable)
메서드 내에 선언된 변수들은 그 메서드 내에서만 사용할 수 있으므로 서로 다른 메서드라면 같은 이름의 변수를 선언해도 된다.
메서드이름(값1, 값2); // 이때 값1,2를 인자(argument)라 한다.
변수와 마찬가지로 static이 붙어있으면 클래스 메서드이고, 아니면 인스턴스 메서드이다.
인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다.
인스턴스와 관계없는 (인스턴스 변수나 메서드를 사용하지 않는) 메서드를 클래스 메서드를 클래스 메서드로 정의한다.
클래스 메서드는 인스턴스 변수를 사용할 수 없다.
: 클래스 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수도 있다.
메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙일 것을 고려한다. (메서드 호출시간이 짧아지므로 성능이 향상된다.)
: 응용프로그램 실행 -> JVM은 필요한 메모리를 할당받고, -> JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
Class File -> Class Loader System -> Runtime Data Area
⬇️ Runtime Data Area
=========
=========
=========
=========
+ PC Register, Native Method Stack
-> 실행 엔진 (Execution Engine)
사용이유: 논리적 간결함.
조건문 필수! 만약 조건문이 잘못 설정되면 재귀호출이 계속 일어나고 메서드는 종료되지 않으므로 스택만 쌓여간다.
-> "스택오버플로우 에러" 발생.
(매개변수의 값이 1,000,000과 같이 큰 경우에도 발생한다.)
-> 그래서 '매개변수의 유효성 검사'가 중요한 것이다.
⚠️ 재귀호출은 비효율적이므로 비용보다 간결함이 주는 이득이 더 클 때 사용한다.
오버로딩이란?
한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
하나의 메서드 이름으로 여러 기능을 구현하기 때문에 붙여진 이름이다.
➡️ 조건
Ex.
void println()
void println(boolean x)
void println(char x)
void println(double x)
...
타입... 변수명 과 같은 형식으로 선언
위의 가변인자는 매개변수 중 가장 마지막에 선언해야 한다.
String concatenate(String s1, String s2) {...}
String concatenate(String s1, String s2, String s3) {...}
⬇️ 가변인자를 사용하면 메서드 하나로 간단히 대체 가능하다.
String concatenate(String... str) {...}
기본 생성자
클래스이름() { }
기본생성자가 컴파일러에 의해 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.
매개변수가 있는 생성자
: 생성자에서 다른 생성자 호출. this는 참조변수로 인스턴스 자신을 가리킨다.
Car(Car c) {
color = c.color;
gearType = c.gearType;
door = c.door;
}
⬇️ 무작정 새로 코드를 작성하는 것보다 기존의 코드를 활용할 수 없는지 고민해야한다.
Car(Car c) {
// Car(String color, String gearType, int door)
this(c.color, c.gearType, c.door);
}