제 9장. 클래스
오늘의 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 키워드가 붙어 있는 정적 멤버(필드 또는 메소드) 는
- 각 인스턴스가 아닌, 클래스에 실체가 준비된다.
2.”클래스명, 멤버명", “인스턴스 변수명, 멤버명" 의 어디에도 같은 실체에 액세스하게 된다 - 인스턴스를 1개도 생성하지 않아도 이용 가능
- 정적 메소드는 그 내부에 정적이지 않은 메소드나 필드를 이용하는 것이 불가능하다
static int maxHp = 50;
static int maxMp = 10;
이런식으로 static을 선언해주면 어떤 클래스에서 선언해주어도 같은 패키지 안에서 사용해줄 수 있다.
Author And Source
이 문제에 관하여(제 9장. 클래스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dongyunhan/제-9장.-클래스저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)