Java 클래스
🔎 클래스
객체란?
물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서
자신의 속성을 가지고 있으면서 식별 가능한 것.
→ iv(Instance Variable)의 집합
→ iv는 인스턴스가 생성될 때 만들어진다.
속성 : 필드 (field)
동작 : 메소드 (method)
클래스란? : 객체의 설계도.
클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.
클래스로 부터 만들어진 객체를 해당 클래스의 인스턴스라고 한다.
클래스의 구성 멤버
클래스에는 객체가 가져야 할 구성 멤버가 선언된다. 구성 맴버에는 필드, 생성자, 메소드가 있다.
🔎 필드 (Field)
객체의 데이터가 저장되는 곳
선언 형태는 변수와 비슷하지만 필드를 변수라고 부르지는 않는다.
🔎 생성자 (Constructor)
🔥 모든 생성자는 첫줄에 다른 생성자를 호출해야 한다 🔥
생성자란?
객체 생성 시 초기화 역할 담당 (iv 초기화 메서드)
생성자의 조건
생성자의 이름은 클래스의 이름과 같아야한다.
생성자는 리턴값이 없다. 하지만
void
는 쓰지 않는다.모든 클래스는 반드시 하나 이상의 생성자를 가져야한다.
생성자의 종류
⒈ 기본 생성자.
매개변수가 없는 생성자
만들지 않을 경우 컴파일러가 자동으로 생성자를 생성한다.
class Car {
String color;
String model;
String company;
// constructor
Car() {}
}
⒉ 매개변수 있는 생성자
// 클래스 작성
class Car {
String color;
String model;
String company;
// 기본 생성자 필수 작성
Car() {}
// 매개변수 있는 생성자
Car(String c, String m, String com) {
color = c;
model = m;
company = com;
}
}
// 객체 생성할 떄
Car myCar = new Car("black", "new", "hyundai" )
this(), this(매개변수)
생성자에서 다른 생성자 호출할 때만 사용
다른 생성자 호출시 첫 줄에서만 가능.
클래스 이름 대신에 this를 사용하는 것.
코드의 중복을 방지하기 위해 사용한다.
class Car {
String color;
String model;
String company;
Car () {
this("black", "new", "hyundai");
}
Car(String color, String model, String company) {
this.color = color;
this.model = model;
this.company = company;
}
}
참조 변수 this
인스턴스 자신을 가리키는 참조변수
인스턴스 메서드에서 사용가능 (생성자 포함)
지역변수(lv)와 인스턴스 변수(iv)를 구별하기 위해 사용
변수의 이름이 다르다면 this를 생략 가능하지만, 변수의 이름이
중복될 경우에는 반드시 this를 명시해줘야 한다.
class Car {
String color;
String model;
String company;
Car(String color, String model, String company) {
// 인스턴스 변수 = 지역변수;
this.color = color;
this.model = model;
this.company = company;
}
}
🔎 메소드 (Method)
- 객체의 동작에 해당하는 실행 블록
리턴 값
리턴할 값이 없는 경우 리턴 타입에 void
를 적어준다.
반대로 리턴 값이 있는 경우는 아래와 같이 작성해 준다.
// 메서드
int add(int x, int y) {
int result = x+y;
return result;
}
static메서드와 instance메서드
static메서드와 instance메서드의 가장 큰 차이점은 인스턴스 변수의 사용여부이다.
⒈ instance 메서드
인스턴스 생성 후, ‘참조변수.메서드이름()’으로 호출
인스턴스변수나 인스턴스메서드와 관련된 작업을 하는 메서드
메서드 내에서 인스턴스변수 사용가능
⒉ static 메서드
📌 언제 static을 사용하나요? 📌
▻ 클래스 내에서 instance variable을 사용하지 않을 때 사용한다.
객체생성없이 ‘클래스이름.메서드이름()’으로 호출
인스턴스변수나 인스턴스메서드와 관련없는 작업을 하는 메서드
메서드 내에서 인스턴스변수 사용불가
메서드 내에서 인스턴스변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.
class MyMath2 {
// iv
long a, b;
// 인스턴스메서드
long add() {
return a + b;
}
// 클래스메서드(static메서드)
static long add(long a, long b) {
return a + b;
}
}
class MyMath2Class {
public static void main(String[] args) {
// 클래스 메서드 호출
System.out.println(MyMath2.add(1,2))
// 인스턴스 메서드 호출
MyMath2 mm = new MyMath2();
mm.a = 1;
mm.b = 2;
System.out.println(mm.add());
}
}
🔥 결론 🔥
static 메서드는 객체 생성없이 호출이 가능하다. 반면에 iv는 객체 생성 후에
호출 가능하다. 즉, iv의 집합인 객체가 생성이 되지 않기 때문에, static 메서드는
iv, im을 사용할 수 없는 것이다.
메소드 호출
메소드는 클래스 내부 및 외부에서 호출이 가능하다.
클래스 내부의 다른 메소드에서 호출할 경우에는 단순한 메소드 이름으로 호출하면 된다.
하지만 클래스 외부에서 호출할 경우에는 우선 클래스로부터 객체를 생성한 뒤 참조 변수를
이용해서 메소드를 호출해야 한다.
- 클래스 내부에서 호출하는 경우
public class TestClass {
// static method
static void staticMethod1 (int x, int y) {
int result = x + y;
return result;
}
// instance method
void instanceMethod1 () {
method1(1,2); // staticMethod1 호출
}
}
- 클래스 외부에서 호출하는 경우
우선 클래스로 부터 객체를 생성해야 한다. 왜냐면 매소드는 객체에 소속된 멤버이므로
객체가 존재하지 않으면 메소드도 존재하지 않기 때문이다.
package test.test;
public class TestClass {
public static void main(String[] args) {
// 새로운 객체 생성
Test mathTest = new Test();
// 외부에서 접근
mathTest.method1();
mathTest.method2();
}
}
🔎 스택
호출 스택이란?
메서드 수행에 필요한 메모리가 제공되는 공간이다.
메서드가 호출되면 호출 스텍에 메모리할당, 종료되면 해제된다.
맨 아래의 main
메서드가 println
메서드를 호출하게 되면,
스택이 아래와 같이 쌓이게 되고, 맨 위에 있는 메서드만 실행되며
나머지는 메서드는 대기상태가 된다.
STACK | 상태 |
---|---|
println | 실행 |
main | 대기 |