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대기