제 9장. 클래스

18615 단어 JavaJava

오늘의 TIP

수정하고 싶은 변수 우클릭 - refacter - rename(shift + F6) 을 사용하면 수정하는 변수와 같은 모든 변수를 한번에 수정할 수 있다.


<가볍게 넘기는 깨알 지식>

test 방법론 : 작성한 코드에 문제가 있는지 없는지 테스트해주는 방법

unit test 화이트박스 + 블랙박스

블랙박스
블랙박스는 소프트웨어의 내부 구조나 작동 원리를 모르는 상태에서 동작을 검사하는 방식이다.
올바른 입력과 올바르지 않은 입력을 입력하여 올바른 출력이 나오는지 검사한다.
--> 사용자 관점의 단위 테스트 방법

화이트박스
화이트박스는 응용 프로그램의 내부 구조와 동작을 검사하느 테스트 방식이다.
소프트웨어 내부 소스 코드를 테스트 하는 기법.
--> 개발자 관점의 단위 테스트 방법

이런게 있다 정도만 알고 넘어가자!

=============================================================

클래스의 개념

객체 지향 프로그래밍에서는 모드 데이터를 객체로 취급하며 이러한 객체가 바로 프로그래밍의 중심이 되는데 이 때 객체를 만들어 내기 위한 설계도와 같은 개념을 클래스라고 한다.

자바에서는 이러한 클래스를 가지고 여러 객체를 생성하여 사용하게 된다.

클래스는 객체의 상태를 나타내는 필드와 객체의 행동을 나타내는 메소드로 구성된다.

필드 : 클래스에 포함된 변수를 의미
메소드 : 특정 작업을 수행하기 위한 명령문의 집합

인스턴스

자바에서는 하나의 클래스로부터 여러개의 인스턴스를 생성할 수 있다.
이렇게 생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있다.
그러나 해당 클래스 내의 모든 메소드는 해당 클래스에서 생성된 모든 인스턴스가 공유하게 된다.

간단한 예시)

클래스(class) : 차(설계도)

필드(field)
이름 : car.modelName = "아우디" | car.modelYear = 2020 | car.color = 검정색

메소드(method) : car.accelerate() | car.brake()

인스턴스(instance) : my car | friend car --> 설계도에 의해 생산되었지만 서로 다른 차량

public class CarMain {
    public static void main(String[] args) {
    }
}
public class Car{

}

먼저 CarMain 과 Car 클래스를 만들어준다.

public class CarMain {
    public static void main(String[] args) {
    Car audi = new Car(); 
    }
}

new는 객체를 생성할 때 사용하는 키워드이다.
이렇게 되면 Car 클래스의 인스턴스인 audi, 즉 Car의 객체가 만들어진다.

public class Car {
    String name;

Car 클래스에 name이라는 String 변수를 추가했다. 이렇게 클래스에 선언된 변수를 객체 변수라고 한다.

클래스에 의해 생성되는 것은 객체, 그 클래스에 선언된 변수는 객체변수

public class CarMain {
    public static void main(String[] args) {
        Car audi = new Car();
        System.out.println(audi.name);
    }
}

객체변수를 출력해보면 null이라는 값이 나오는데 이는 audi.name에 아무값도 넣어주지 않아서이다.

public class Car {
    String name;

    public void setName(String name) {
        this.name = name;  //여기서 사용되는 this. 는 현재 클래스 내의 객체 자기자신을 말한다. 
        //--> this.name = audi.name 과 동일하다.
    }
}

이렇게 setName 이라는 메소드를 추가해주면
입력은 String name 이 되고 출력은 void로 리턴값이 없을것이다.
setName 메소드를 호출해보자

public class CarMain {
    public static void main(String[] args) {
        Car audi = new Car();
        audi.setName("아우디");
        System.out.println(audi.name);
    }
}

추가로 audi객체말고 porsche객체를 audi객체를 추가했을때와 동일하게 추가(이름은 다른게 설정)해서 audi.name과 porsche.name 을 출력해보자

public class CarMain {
    public static void main(String[] args) {
        Car audi = new Car();
        audi.setName("아우디");

        Car porsche = new Car();
        porsche.setName("포르쉐");

        System.out.println(audi.name);
        System.out.println(porsche.name);
        
    }
}

이전의 Car클래스를 동일하게 사용하고 있는데 서로 다르게 나온다는것을 확인할 수 있다.
--> 객체 변수는 공유되지 않는다는 것을 확인 할 수 있다.(객체 변수의 값이 독립적으로 유지)

생성자

  • “클래스명과 동일 명칭으로, 리턴 값의 타입이 명시되어 있지 않은 메소드"는 생성자로 사용된다.
  • 생성자는 new 에 의한 인스턴스화의 직후에 자동적으로 실행 된다.
  • 인수를 가지는 생성자를 정의하면, new 를 할 때에 인수를 지정하여 생성자를 실행할 수 있다
  • 생성자는 오버로드에 의한 복수 정의가 된다.
  • 클래스에 생성자 정의가 1개도 없는 경우에 한해, 컴파일러가 “인수없음, 처리내용없음"의 기본
    생성자를 자동정의 해 준다.
Cleric(String name, int hp, int mp) {  //생성자 오버로드
        this.name = name;
        this.hp = hp;
        this.mp = mp;
    }

    Cleric(String name, int hp) {
        this.name = name;  //name 중복
        this.hp = hp;  //hp 중복
        this.mp = Cleric.maxMp; //mp중복
    }

이런식으로 생성자를 생성해주면 main에서 아래와 같이 사용해줄 수 있다. 여기서 문제는 생성자를 여러개 만들어서 사용한다고 하면 중복되는 코드가 많이 사용되는데

  • 여기에서 생성자들간에 중복되는 코드가 없도록 작성해주고 싶으면 this()를 사용해준다.
    (동일 클래스의 다른 생성자를 호출 할 수 있다)
Cleric(String name, int hp, int mp) {  //생성자 오버로드

        this.name = name;
        this.hp = hp;
        this.mp = mp;
    }

    Cleric(String name, int hp) {
        this(name, hp, maxMp); // 생성자들간에 중복된 코드가 없도록 만들어준다.
    }
 		Cleric cleric1 = new Cleric("아서스1", 40, 5);
        System.out.println(cleric1.name + " | " + cleric1.hp + " | " + cleric1.mp);

        Cleric cleric2 = new Cleric("아서스2", 35);
        System.out.println(cleric2.name + " | " + cleric2.hp + " | " + cleric2.mp);

정적 멤버

  • static 키워드가 붙어 있는 정적 멤버(필드 또는 메소드) 는
  1. 각 인스턴스가 아닌, 클래스에 실체가 준비된다.
    2.”클래스명, 멤버명", “인스턴스 변수명, 멤버명" 의 어디에도 같은 실체에 액세스하게 된다
  2. 인스턴스를 1개도 생성하지 않아도 이용 가능
  • 정적 메소드는 그 내부에 정적이지 않은 메소드나 필드를 이용하는 것이 불가능하다
	static int maxHp = 50;
    static int maxMp = 10;

이런식으로 static을 선언해주면 어떤 클래스에서 선언해주어도 같은 패키지 안에서 사용해줄 수 있다.

좋은 웹페이지 즐겨찾기