Loading...

JAVA / / 2022. 1. 12. 12:34

자바 12강. 클래스

반응형

class를 만들 때 규칙이 있다.

 

1. 클래스는 상태와 행위를 가진다.

 

상태 : 변수

(ex. 목이 마른 정도 = 30)

 

행위 : 메서드

(ex. 물 마시기)

 

2. 상태는 직접 변경할 수 없다.

행위를 통해서만 변경이 가능하다.

(ex. 목이 마른 정도 = 50

으로 직접 변경 불가능)

 

3. 자바는 모든 코드가 클래스 내부에 들어와야한다.(언어마다 특징이 다름)

자바에서 class가 1급객체이기 때문이다.

클래스 생성은 자체가 클래스이기 때문에 밖에 쓸 수 있다.

 

상태만 있고 행위는 없는 클래스가 있긴 하다
이것은 상태가 고정되어 있는 클래스이다.

 

상태가 있고 행위는 없을 수도 있고

상태는 없고 행위만 있을 수도 있고

둘 다 없을 수도 있다.

 

클래스의 구조는 이렇다.

 

class Car {      

상태   

행위( ) {

    }           

     }                 

파일의 기본 클래스 내부의 main에 만드는 것이 아니라

main 밖에 패키지 아래 새로 만들어야 한다.

 

사진과 같이 Car 클래스를 만들어보자.

우선 클래스 이름은 첫 글자가 대문자이고 파스칼 표기법이다.

 

그리고 int speed = 90;이라고 입력했다.

 

Car 클래스에서 선언한 변수를 main에서 호출할 수 있을까?

 

변수 speed가 static 타입으로 선언이 되었다면

프로그램이 시작하기 전부터 메모리에 떠서

끝날 때까지 떠있을 것이다.

 

하지만 main에서

System.out.println(speed);

라고 변수를 호출하면

에러가 날것이다.

 

이때는 클래스 이름을 참조해줘야 한다.

이름이나 주소를 참조해줄 때 연결 연산자(.)를 사용한다.

 

static에 올라간 변수는 클래스명.변수명 (Car.speed)

형식으로 호출해준다.

 

여기서 알 수 있는 한 가지!

 

클래스명(앞에 대문자). 변수 이름

형식으로 호출을 하면

그 변수는 static이 붙어있는 것!

 

package ex07;

class Car {
    static int speed = 90;
}

public class OOPEx01 {
    public static void main(String[] args) {
        System.out.println(Car.speed);
    }
}

 

만약 OOPEx01 클래스 내부에 생성하는 변수들은

내 안에 있는 변수들이라 클래스 이름을 생략하고 호출이 가능하다.

 

static을 지정해준 변수나 메서드는

프로그램이 시작할 때 딱 한 번만 띄우고,
실행되기 전부터 올라와있어서 제어할 수도 없다.

 

내가 원할 때, 원하는 만큼 변수를 메모리에 띄우기 위해

새로운 방법을 사용할 것이다.

 

10번 줄에 생소한 문자열이 하나 보인다.

Car sss = new Car();

 

new는 heap에 메모리를 할당하라는 키워드이다.

 

Car() 클래스가 가지고 있는

static이 붙어있지 않은 변수나 메서드를 메모리에 띄우는 역할을 한다.

 

new Car();라고만 적어도 메모리에 할당이 가능하다.

하지만 어디에 할당되었는지 찾을 방법이 없기 때문에 이름(주소)을 지정해줘야 한다.

 

클래스를 메모리에 할당할 때에도 자료형(타입)이 필요하다.

하지만 클래스의 크기가 얼마나 클지 모르기 때문에

stack에는 4Byte 크기의 공간이 할당되어 heap의 주소가 저장될 것이다.

call by reference이다.

 

이때 클래스의 타입은 클래스의 이름에서 따온다.

이 클래스 타입을 커스텀 타입이라고 한다.

 

package ex07;

class Car {
    int speed = 90;
}

public class OOPEx01 {
    public static void main(String[] args) {
        Car s1 = new Car();
        System.out.println(s1.speed);

        Car s2 = new Car();
        System.out.println(s2.speed);
    }
}

똑같은 클래스에서 여러 개의 변수를 만들 수도 있다.

이 경우에는 heap에 새로운 공간이 할당된다.

class를 붕어빵 틀처럼 사용하여 변수를 계속 찍어내는 것이 가능하다.

s1과 s2는 다른 자동차이다.

 

하지만 speed가 static이었다면 불가능하다.

static은 class당 1개의 영역이 생기고

1개의 변수만 올릴 수 있다.

 

여러 개의 static을 만들기 위해선 여러개의 클래스를 만들어야 하는 것이다.

 

위 코드가 실행될 때 순서를 생각해보자.

JVM이 static을 찾고 메모리에 우선 띄운 다음 main을 찾아 실행시킨다.

JVM이 main을 실행할 때 stack에 main 공간을 확보하고 main Queue가 생성된다.

 

main Queue에서 14번 라인이 Car s1 = new Car();라고 한다면,

오른쪽 항부터 인식해서 new를 보고 Car클래스에 있는

static이 아닌 모든 것을 heap에 할당하고

stack에 s1이름의 4Byte 크기 공간에 heap의 주소를 저장한다.

 

메모리에 데이터를 띄우는 방법 2가지

static : 처음부터 띄우기

new : 원하는 시점에 동적으로 띄우기

 


package ex07;

// 설계도 생성
class 마법사 {
    // 상태
    int hp = 30;
    int mp = 100;

    // 행위 = 메서드
    // 문법 1. 행위안에 행위를 추가할 수 없다.
    // 2. 행위는 메서드 이름 + () + {} 로 만들어진다.
    void drink() {
        System.out.println("에너지 마시기");
        hp = 100;
    }
}
public class OOPEx03 {
    public static void main(String[] args) {
        마법사 p1 = new 마법사();
        System.out.println("첫번째 마법사가 생성되었습니다.");
        System.out.println("체력 : " + p1.hp);
        System.out.println("마나 : " + p1.mp);
        p1.drink(); // 메서드 호출(call)
        System.out.println("체력 변경 : " + p1.hp);
        마법사 p2 = new 마법사();
        System.out.println("두번째 마법사가 생성되었습니다.");
        System.out.println("체력 : " + p2.hp);
        System.out.println("마나 : " + p2.mp);
    } // 메인 종료
}

 

new를 사용하면 행위의 영역인 메서드도 heap에 뜨지만

메서드의 내부가 뜨진 않는다.

 

조건에 맞으면 호출하지 않아도 실행되는 for, while, if는 표현식(expression) 코드이고,

메서드는 호출을 해야 사용이 가능하다.

호출하는 것 = call

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형