코딩 노트

Java Class 본문

Java

Java Class

newbyeol 2023. 7. 12. 22:24

Class

- 클래스는 객체를 만들기 위한 설계도 같은 것이다.

- 필드가 만들어져야 클래스의 나머지 형태를 구성할 수 있다.

- 클래스는 필드에 따른 setter 메소드와 getter메소드를 개수를 맞춰 만들어야 한다.

 

//시험 성적 정보를 자바에게 설명하기 위해 만드는 도구(클래스) 
public class Grade {

//시험 성적 정보의 구성요소 데이터를 정의(멤버 필드)(member field) - 데이터
String name;
int korean;
}

'변수 2개를 묶어서 grade라고 부르겠다'를 자바에게 알려주는 것이다.

위 코드는 객체가 생긴 것이 아닌 클래스가 생긴 것이다.

 

객체

- 멤버 필드와 멤버 메소드만 들어간다. (멤버는 회원, 구성원이라는 의미)

Pokemon a = new Pokemon(); //Pokemon의 객체(인스턴스)를 생성

 

클래스에 등장하는 단어

모듈: 자주 쓰는 것들을 보관해놓고 불러오는 것을 말한다.

멤버 메소드: 공통 코드를 저장하는 코드 저장소

void: 반환 값이 없음, 결과물이 없음이라는 의미를 가지는 키워드이다.

this: 클래스의 멤버를 의미한다. (내꺼)

return: '반환'과 '종료'의 의미를 가지는 키워드이다.

 

메소드 오버로딩(method overloadaing) 

ex) setup을 두 종류로 구현

1. 3개의 데이터가 들어오면 이벤트는 안 하는 걸로 생각하여 처리

2. 4개의 데이터가 들어오면 이벤트 정보도 설정하는 걸로 처리

void setup(String name, String type, int money) {
this.name = name;
this.type = type;
this.money = money;
this.event = false;
}

void setup(String name, String type, int money, boolean event){
//그래서 이쪽에서 할인하지 않음
this.name = name;
this.type = type;
this.money = money;
this.event = event;
}

메소드는 할일만 하고 끝나는 메소드(void)나 할일을 하고 내놓는 메소드(return)가 있어야 한다.

 

float getAverage() { //나는 float 를 내놓는 메소드!
return this.getTotal() / 3f;
}
boolean getPass() {
return this.korean >= 40 && this.english  >= 40 && 
this.math >= 40 && getAverage() >= 60;
}

getter 메소드를 계산할 때만 부르는 용도로 만들어서 쓸 수 있다.

 

코드의 문제점

1. 잘못된 데이터 설정이 가능하다.

    - 해결법: 데이터를 설정하는 부분에 조건을 추가하면 된다.

2. 하나의 정보만 바꿀 수 없다.

    - 해결법: 데이터를 하나만 설정할 수 있는 메소드를 만든다. (Setter 메소드)

    - ex) 점수를 바꾸고 싶은데 이름까지 적어야 한다.

    - 변수에 직접적으로 접근하는 일은 좋지 않다. (잘못된 데이터를 막을 수 없기 때문에)

 

필드 개수와 setter 메소드 개수가 같아야 한다.

어떠한 경우에도 setter 메소드로 연결시켜서 데이터 차단이 이루어지게 해야한다.

Setter 메소드

- set + 필드명으로 이름을 짓는다.

- 필드(데이터)를 하나씩 변경할 수 있는 메소드이다.

- 설정 외에 다른 작업을 하지 않는다. (내가 조건을 쓰고 조건을 건 항목만 검사한다.)

    - 들어올 때 데이터가 맞게 들어오나 조건에 맞게 검사를 하는 것

- 올바른 데이터만 설정 가능하도록 필더링 처리를 한다.

- 세터에서 조건을 쓸 때 다른 언급이 없다면(ex. this) 가장 가까운 쪽으로 간다.

    - ex) this를 붙이면 맨 위 멤버 필드쪽으로 가는 것이다.

        붙이지 않았을 경우 메소드 옆 괄호안에 있는 매개변수로 간다.

 

void setup(String name, int score) {
this.setScore(score); //내가 가진 setScore 메소드에 score를 전달하며 호출하겠다.
}
void setScore(int score) { //this.score 쓰면 안됨, 괄호 안에 있는 전달받은 score를 말하는 것.
if (score >= 0 && score <= 100 ) {
this.score = score;
}

 

getter 메소드

- 설정된 값을 반환하는 메소드

- 이름은 get + 필드명, 반환형은 필드의 자료형과 같다.

- 가상의 항목(존재하지 않는 필드)에 대해서 getter 메소드를 만들면 계산을 간소화할 수 있다.

- getter 메소드가 필요한 이유는 private으로 설정해도 외부에서 확인이 가능해야 하기 때문이다.

- (참고) 논리가 반환값인 getter 메소드는 get이 아닌 is로 시작하게 작명한다.

String getName() {
return this.name;
}
int getTotal() {
return this.korean + this.english + this.math;
return this.getKorean() + this.getEnglish() + this.getMath(); //이 방법을 추천하나 둘 다 ok

 

switch case문은 정수랑 문자열만 사용 가능하고 변수를 적지 못한다.

조건이 많을 때는 return을 쓰는게 편하다.

 

void setPrice(int price) { 
if(price < 0) {
return; //반환은 없지만 중지하세요! 
}
this.price = price;
}

위 코드의 메소드에서는 반복문의 break를 쓰지 못하니 return을 써서 중지시켰다.

 

추천하는 조건문 쓰는 법1

-전

void setPrice(int price) {
if(price >= 0) {
this.price = price;
}
}

-후

void setPrice(int price) {
if(price < 0) {
return;
}
this.price = price;
}

 

추천하는 조건문 쓰는 법2

void setKorean(int korean) {
if(korean >= 0 && korean <= 100)
this.korean = korean;
}

void setEnglish(int english) { //이런 코드 추천
if (english < 0 || english > 100) return;
this.english = english;
}

void setMath(int math) {
if (!(math >= 0 && math <= 100)) {
this.math = math;
}
}

 

 

Score a = new Score();
Score b = new Score();
Score c = new Score();

a.setup("마리오", 1, 90, 80, 70);
b.setup("루이지", 1, 85, 85, 83);
c.setup("쿠파", 1, 70, 60, 55);

//위처럼 생성하고 값을 넣어주는게 효과적인 방법이 아니다.
//그래서 생성자를 만드는 것

생성자(constructor)

- 정보가 설정된 채로 만들게 되는 것

- 생성 시 필요한 데이터를 강제하는 도구이다.

- 생성자를 만들 때는 이름을 꼭 클래스 이름으로 설정해야 한다.

- 생성자도 오버로딩이 가능하다.

- 생성자는 객체를 생성할 때 필요한 데이터를 전달받는 초기화 전용 구문이기 때문에 필요하다.

- 생성자는 멤버라고 하지 않는다.

 

기본 생성자

- 생성만 하고 아무 짓도 하지 않는다.

- 한 개도 없으면 자동으로 생성된다.

- 생성자가 없다면 객체 생성이 불가능하다.

 

클래스의 구성요소

1. 멤버 필드 - 데이터

2. 멤버 메소드 - 코드

3. 생성자 - 초기화

필드는 private으로, 메소드와 생성자는 public으로 선언한다.

    - 필드는 접근을 차단해야 한다. 원하는 값으로 통제해야 하기 때문이다.

4. 중첩클래스

 

클래스 이름(필요한 데이터){
}


Student(String name, int score){
this.name = name;
this.score = score;
}

 

접근제한자(Access Modifier)

접근제한은 객체의 데이터(멤버 필드)를 원하는 값으로 통제하기 위하여 사용한다.

 

- private
클래스 외부의 접근을 차단
- package
패키지 외부의 접근을 차단(기본값)
- protected
패키지 또는 상속관계가 아닌 경우의 접근을 차단
- public
특별한 차단을 하지 않음

 

// 1. 자세히 말한 버전
// 만약 총납부횟수랑 현재납부횟수가 같다면
// - 적금이 만기되었다고 판정
// 아니라면
// - 적금이 만기되지 않았다고 판정

public boolean isFinish() {
if(this.getToalCount() == this.getCount()){
return true;
} else {
return false;
}


// 말하는 것과 같은 간단한 버전 (★추천)
// 2. 총 납부횟수랑 현재납부횟수가 같은지 판정

public boolean isFinish() {
return this.getToalCount() == this.getCount();
}

 

자바는 기본적으로 접근 제한의 범위가 패키지 범위이다.

- 패키지에 없는 것은 모르는 것으로 간주한다.

- import를 통해 알려줘서 해결 가능하다. 

    - 단, import는 public일 때만 가능하다.

- class가 public이라고 필드에 영향을 미치는 게 아니라 필드도 public을 해야 접근 가능하다.

    - (그렇지만 필드는 보통 접근을 제한하기에 private를 붙인다.)

- 특수한 경우만 아니면 public을 붙이는 게 맞다.

 

ststic 

- 탈 객체지향 키워드(객체지향을 하지 않겠다.)

 

객체 지향의 문제점

1. 내부 구조가 복잡하다

    - 필드를 제거
2. 객체를 꼭 만들어야 한다.

    - static 키워드를 추가
    - static 키워드가 붙은 메소드는 객체 생성 없이도 호출 가능하다.(메모리에 고정됨)
        - 이런 건 보통 자주 쓰는 계산들을 모듈화 시킬 때 많이 쓴다.

 

참조형 데이터는 리모컨만 전달하면 외부에서 직접 제어 가능하다.

= 리모컨 전달(call-by-reference)

 

변수는 하나의 값만 저장이 가능하며, 대입하면 값을 덮어쓰기 한다.

변하면 안 되는 값(ex. 원주율), 최초 이후의 대입을 금지하고 싶다면 final 키워드를 추가하면 된다.
final 키워드는 값의 변경을 원천봉쇄하기 위해서 사용한다. (ex. 네이버 아이디, 카페 글번호)

 

 

멤버 필드에서 final을 쓰면 에러가 나는 이유

- 생성과 동시에 초기값으로 잠겨버리기 때문이다. (name에는 numm, score은 0)
- 그래서 반드시 생성자가 있어야하며, final 항목에 값을 넣어줘야 한다.
- final 필드는 setter 메소드 생성이 불가능하다. (getter 메소드만 넣을 수 있음)

private final String name;
private final int score;

public Student(String name, int score) {
this.name = name;
this.score = score;
}

 

상수

- 어디서나 객체없이(static) 변하지 않는(final) 값을 만들어서 사용한다.

- 의미전달을 명확히 하려고 만드는 수이다.

- 언제나 변하지 않는 수, 아무데서나 접근 가능한 수이다.

 

//ex)가위바위보에서 시스템적으로 가위가 0이라는 걸 정의해놓는 것

public static final int scissors = 0;
public static final int rock = 1;
public static final int paper = 2;

'Java' 카테고리의 다른 글

Java.util.collection - Map  (0) 2023.07.14
Java.util.collection - Set  (0) 2023.07.13
Java.util.collection - List  (0) 2023.07.12
java.util.scanner + java.util.random  (0) 2023.07.12
java.time + DecimalFormat  (0) 2023.07.11