JAVA, 클래스

infoqoch·2021년 2월 28일
0

JAVA

목록 보기
8/9

목표
자바의 Class에 대해 학습하세요.
학습할 것 (필수)
클래스 정의하는 방법
객체 만드는 방법 (new 키워드 이해하기)
메소드 정의하는 방법
생성자 정의하는 방법
this 키워드 이해하기

1. 객체 지향 프로그래밍 OOP Object Oriented Programming 을 위하여

1.1 객체

  • 객체는 현실 세계의 것을 소프트웨어로 모델링하는 결과물을 의미한다. 어떤 사람은 이름과 나이라는 속성(필드)를 가지며 동시에 밥을 먹거나 잠을 자는 행동(메서드)를 가진다. 사람은 자동차로 운전을 하는 것처럼 소프트웨어에도 다양한 객체가 관계를 맺는다. 이러한 프로그래밍을 객체 지향 프로그래밍이라 한다.

1.2 클래스

  • 클래스란 객체를 생성하기 위한 설계도이다. 학교의 학생들이 있다면, 학생은 대략 이름, 학년, 교실, 나이, 성적 등의 속성으로 이해할 수 있다. 학생은 등교를 하고 공부를 하고 점심 식사를 하고 중간고사를 보는 등 행동으로 이해할 수 있다. 학생의 속성과 행위를 일종의 설계도로로 구현하는 것을 클래스라 한다. 각 학생의 속성을 홍길동, 1학년, 1반, 17살, 6등 따위로 부여하여 특정한 학생을 구현하는 것을 객체라 한다.

2. 클래스

2.1 클래스 정의

public class Student { ..............(0)
    private String name; ............(1)
    private int age;
    private int math;

    public Student() { ............(2)
        this.name="홍길동";
        this.age=17;
    }
    public void setInfo(String name, int age, int math) { ............(3)
        this.name = name;
        this.age = age;
        this.math = math;
    }


    public Student(String name, int age, int math) { ................(4)
        this.name = name;
        this.age = age;
        this.math = math;
    }


    public void studyMath(int hour){ .............(5)
        System.out.println(name+"이 "+hour+"시간 동안 수학 공부를 했다.");
        if(math>=100){
            System.out.println(name+"이 수학을 너무 잘해서 오를 성적이 없다!");
            return;
        }

        this.math+=hour;
        System.out.println(name+"의 성적이 올랐다");

        if(math>=100) {
            this.math = 100;
        }
    }

    public String getName() { .............(6)
        return name;
    }

    public int getAge() {
        return age;
    }

    public int getMath() {
        return math;
    }
}

(0) 클래스를 정의할 때 이름은 반드시 java파일의 이름과 동일해야 한다. 그리고 그 클래스는 접근 범위를 public으로 해야 한다. 이를 통해 어플리케이션이 작동할 때 해당 클래스가 로딩되고 작동한다. 클래스(자바 파일)의 이름은 영어로 작성하고 첫 단어를 대문자로 하는 것을 원칙으로 한다.
(1) 필드 : 클래스의 필드를 정의한다. private을 통해 객체의 필드값에 바로 접근할 수 없도록 한다. 개발자가 의도한 방식으로 값을 입력하고 출력하도록 한다.
(2) 생성자 : 클래스를 통해 인스턴스(객체)를 생성시 초기화한다. this는 생성되는 객체의 필드값을 의미한다. 인스턴스가 초기화 될 때 해당 인스턴스의 필드 값도 함께 초기화할 수 있다.
(3) 메서드 : 생성자의 필드를 해당 메서드의 매개변수를 통해 주입한다.
(4) 생성자 : 클래스의 생성자에 입력하는 매개변수를 다양하게 설계하여, 다양한 방식으로 객체를 초기화 할 수 있다. 이러한 방식을 오버로딩Overloading이라 한다. 매서드도 가능하며, 이때에는 같은 리턴값과 같은 이름을 공유한다.
(5) 메서드 : 해당 객체의 행위를 설계한다. 여기서는 투여된 시간(매개변수 int)만큼 성적이 오르도록 설계했다.
(6) 매서드 : 필드 값을 출력한다.

2.2 인스턴스의 선언 및 초기화, 활용

public class School {
    public static void main(String[] args) {
        Student stuA = new Student(); ...........(1)
        // stuA.math=80; // error : 'math' has private access .......(2)
        // System.out.println(stuA.math);
        stuA.register("김국진", 18, 70);...........(3)

        Student stuB = new Student("노홍철", 20, 95);.........(4)
        stuA.studyMath(8);.........(5) // 김국진이 8시간 동안 수학 공부를 했다. 김국진의 성적이 올랐다
        stuA.studyMath(8);.........(5) // 김국진이 8시간 동안 수학 공부를 했다. 김국진의 성적이 올랐다
        stuB.studyMath(8); // 노홍철이 8시간 동안 수학 공부를 했다. 노홍철의 성적이 올랐다
        stuB.studyMath(8); //노홍철이 8시간 동안 수학 공부를 했다. 노홍철이 수학을 너무 잘해서 오를 성적이 없다!

        System.out.println(stuA.getName()+"의 수학 성적은"+stuA.getMath()+"입니다.");..........(6) // 김국진의 수학 성적은 86입니다.
        System.out.println(stuB.getName()+"의 수학 성적은"+stuB.getMath()+"입니다."); // 노홍철의 수학 성적은 100입니다.

    }
}

(1) stuA 인스턴스를 생성한다. 이때 new 키워드를 사용한다. 이는 인스턴스를 선언하고 해당 데이터를 힙에 저장하며 해당 변수는 참조변수임을 의미한다. 구체적인 내용은 후술하겠다.
(2) private으로 접근 범위를 설정한 필드는 외부의 클래스에서 직접 접근할 수 없다. 아래의 코드처럼, 설계 시 의도한 방향으로 해당 값을 접근해야만 한다.
(3) stuA는 매개변수가 없는 생성자를 통해 초기화 했다. 그리고 매서드를 통해 필드를 초기화했다.
(4) stuB는 매개변수가 있는 생성자를 통해 필드값도 함께 초기화 했따.
(5) stuA와 B는 각각의 매서드를 사용했다.
(6) 매서드를 통해 필드값을 호출한다.

2.3 캡슐화

  • 2.2의 예제를 통해 우리는 해당 객체에 접근하고 수정할 때 의도한 방향대로 접근해야 함을 확인했다. 두 개의 생성자를 통해 인스턴스를 선언하고 초기화 할 수 있으며, 필드 값을 입력할 때 register()라는 매서드를 통해 등록한다. 수학 점수가 오르는 것은 studyMath()를 통해서 구현한다. 이러한 구현 방식을 캡슐화라 한다.
  • 캡슐화는 객체의 필드와 메소드를 하나로 묶고, 실제 구현 내용을 감춘다. 객체가 제공하는 필드와 메소드만을 이용한다. 이를 통해 객체의 잘못된 수정으로 발생할 수 있는 side effect를 최소화 한다.

2.4 키워드(연산자) new

  • 객체를 선언할 때 new 키워드를 사용한다. 해당 객체는 메모리(heap)에 저장된다. 그리고 해당 변수 stuA는 해당 메모리를 가리키는 참조변수가 된다.
  • stuA와 stuB는 동일한 매서드를 사용했음에도 불구하고 전혀 다른 값을 호출한다. 클래스는 동일하지만 두 개의 객체는 다른 객체로서 다른 메모리에 저장된다.

백기선 개발자님의 LiveStudy를 진행 중입니다!
주요 참고자료는 <이것이자바다>, 신용권 입니다.

profile
JAVA web developer

0개의 댓글