본문 바로가기

Java

왜 객체변수명을 클래스명과 통일시키는가?

Java의 객체지향 파트를 공부하면서 정말 헷갈리는게 하나 있다.

꽤 많은 예시코드들에서 객체변수명을 클래스명과 통일시키고 있다.

 

일전에도 이런 의문이 있어 질문을 던졌을때 받은 답변이다.

충분히 납득할만한 이유다. 이 객체변수가 어느 클래스를 참조하는지 가장 알기 쉬운 방법은

클래스와 객체변수의 이름을 통일시키는것이다.

 

exam의 향연

그래도 가독성부분은 납득하기 힘들다... 데이터타입, 객체변수, 심지어 파라미터까지 

모두 비슷한 이름이다보니 작성할때는 별 문제 없었는데 코드를 다시 읽어보니 보이는건 exam뿐...

이럴때를 위해 있는게 this 키워드라지만 이건 때에 따라 생략도 가능해서 더더욱 헷갈리게한다.

 

실제로 코드를 캡슐화하는 과정에서 this키워드를 하나 생략했다가 버그가 생겼는데

그것도 모르고 디버깅을 한시간동안 붙잡고 있었다.

 

수정안

차라리 통일성을 조금 해치더라도 객체변수,파라미터명을 각각 구분할수 있게 짓는게 낫지 않을까

거지같은 this 키워드에서도 해방되고...

 

package com.nl1.캡슐화;
 
import java.util.Scanner;
 
public class MakeArraylist {
    static Scanner sc = new Scanner(System.in);
 
    public static void main(String... args) {
        ExamConsole ex = new ExamConsole();
        boolean loop = true;
 
        while (loop) {
            int m = menu();
            switch (m) {
                case 1 -> ex.input();
                case 2 -> ex.output();
                case 3 -> {
                    System.out.println("프로그램 종료.");
                    loop = false;
                }
                default -> System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
            }
        }
        sc.close();
    }
 
    static int menu() {
        System.out.println("      -메인 메뉴-");
        System.out.println("\t1. 성적입력 ");
        System.out.println("\t2. 성적출력 ");
        System.out.println("\t3. 종료 ");
        System.out.print("\t선택> ");
        return sc.nextInt();
    }
    
}
 
 
cs
package com.nl1.캡슐화;
 
import java.util.Scanner;
public class ExamConsole {
    Examlist list = new Examlist();
    Scanner sc = new Scanner(System.in);
    void input() {
        System.out.println("      -성적 입력-");
        int kor, eng, math;
        do {
            System.out.print("국어" + (list.counter + 1+ ":");
            kor = sc.nextInt();
            if (kor < 0 || 100 < kor) {
                System.out.println("성적은 0~100까지의 범위만 입력이 가능합니다.");
            }
        } while (kor < 0 || 100 < kor);
 
        do {
            System.out.print("영어" + (list.counter + 1+ ":");
            eng = sc.nextInt();
            if (eng < 0 || 100 < eng) {
                System.out.println("성적은 0~100까지의 범위만 입력이 가능합니다.");
            }
        } while (eng < 0 || 100 < eng);
 
        do {
            System.out.print("수학" + (list.counter + 1+ ":");
            math = sc.nextInt();
            if (math < 0 || 100 < math) {
                System.out.println("성적은 0~100까지의 범위만 입력이 가능합니다.");
            }
        } while (math < 0 || 100 < math);
 
        Exam ex = new Exam();
        ex.setKor(kor);
        ex.setEng(eng);
        ex.setMath(math);
 
        list.add(ex);
    }
    
    void output() { 
        
        for (int i=0; i<list.size(); i++) {
            Exam exam = list.get(i);
            int kor = exam.getKor();
            int eng = exam.getEng();
            int math = exam.getMath();
            int total = exam.total();
            float avg = exam.avg();
            System.out.println("국어" + (i + 1+ ":" + kor);
            System.out.println("영어" + (i + 1+ ":" + eng);
            System.out.println("수학" + (i + 1+ ":" + math);
            System.out.println("총점" + (i + 1+ ":" + total);
            System.out.println("평균" + (i + 1+ ":" + avg);
            System.out.println("────────────────────────");
        }
    }
}
 
 
cs
package com.nl1.캡슐화;
 
public class Examlist {
     
    private Exam[] score;
    int counter;
    
    public Examlist() {   //생성자
        score = new Exam[2];
        counter = 0;
    }
    
    public void add(Exam ex) {
        //배열 크기 늘리기
        Exam[] origin = score;  
        int size = counter;  
        if (origin.length == size) {   //실제 배열길이와 카운터를 비교
            Exam[] tmp = new Exam[size + 1];    //비교값이 같으면 배열이 값으로 꽉찬상태. 배열길이+1의 임시배열 생성
            for (int i=0; i<size; i++) {    //입력받은 배열값을 임시배열로 옮기고, exams는 임시배열을 참조(길이+1)
                tmp[i] = origin[i];    
                score = tmp;       
            }
        }
        score[counter] = ex;  //exams[]의 마지막 index에 마지막으로 입력받은 값 exam을 입력
        counter++;
        System.out.println("────────────────────────");
    }    
 
    
 
    public Exam get(int i) {
        return score[i];
    }
 
    public int size() {
        return counter;
    }
}
 
cs
package com.nl1.캡슐화;
 
public class Exam {
    private int kor;
    private int eng;
    private int math;
    
    public int getKor() {
        return kor;
    }
    public int getEng() {
        return eng;
    }
    public int getMath() {
        return math;
    }
    public void setKor(int kor) {
        this.kor = kor;
    }
    public void setEng(int eng) {
        this.eng = eng;
    }
    public void setMath(int math) {
        this.math = math;
    }
    public int total() {
        return kor + eng + math;
    }
    public float avg() {
        return total() / 3.0f;
    }
 
}
 
cs

 

수정본 + 원래 목적이였던 input(), output()에서 기능을 분리하여

ExamConsole 클래스에 한번더 캡슐화

+ 출력부 자잘한 수정