충분히 쌓여가는
클래스 본문
자바: 클래스들의 모음
클래스: 객체를 정의하기 위한 설계도
객체: 데이터를 가지고 있고 어떤 행동(연산)들을 수행할 수 있다
객체의 데이터: 클래스 내에서 변수들로 나태지고 행동은 메소드에 의해 저으이됨
ex. String 객체를 생성하고 그 객체의 메소드를 호출하여 이용함
클래스와 객체
- 자바 프로그램은 클래스들로 이루어지고, 클래스는 한 유형의 객체를 정의함
- 클래스는 특정 객체를 만들기 위한 설계도라고 볼 수 있다
- 프로그램 내에서 객체들은 사람, 자동차, 스마트폰과 같은 실 세계의 객체들이나 은행 계좌나 모양과 같은 추상 개념을 나타낼 수 있음
- 객체는 데이터를 가지고 어떤 일(혹은 행동)을 수행할 수 있다
- 그림처럼 사람을 모델하는 Persion 클래스와 Person 객체들을 보여줌
- 그 클래스는 사람 관련 속성(혹은 데이터)와 사람이 할 수 있는 행동을 기술함
- Person 클래스의 객체: 특정한 사람
- Person 클래스로부터 두 개의 Person 객체들이 생성됨
- 한 객의 이름은 person1, 다른 객체의 이름은 person2이다
- 우리는 이 객체들을 구별하기 위해 이름(혹은 참조변수)을 사용함
- 클래스는 모델하는 대상의 속성을 명시함
- Person 클래스는 이름과 나이를 나타내는 두 개의 속성을 가짐
- 클래스는 각 속성의 값을 가지지 않음
- 반면에 클래스로부터 생긴 객체는 각 속성의 값을 가짐
- 클래스 내에서 각 속성은 변수로 선언됨
- 클래스는 객체들이 할 수 있는 일(혹은 행동)들과 그 일을 수행하는 방법을 기술함
- Person 클래스는 Person 객체들이 할 수 있는 4개의 행동들을 기술함
- 그 행동들은 getName, setName, getAge, setAge
- getName: 이름을 알려줌
- getAge: 나이를 알려줌
- setAge: 나이를 변경함
- setName: 이름을 변경함
- 이러한 행동들은 클래스 내에서 메소드들로 표현됨
- 같은 클래스에서 생성된 모든 객체들은 같은 메소드들을 가짐
클래스 구조
- 클래스는 머리부와 몸체로 이루어짐
- 클래스 머리부는 클래스 이름을 포함하고 클래스 이름 앞에는 예약어 class가 나옴
- 머리부의 맨 앞에 있는 public라는 예약어: 프로그램 내에서 어디든지 사용될 수 있는 공개된 클래스라는 것을 의미
public class 클래스이름
{
변수(혹은 상수) 선언문들
메소드 정의들
}
- 변수 선언문들과 메소드 정의들의 위치는 바뀔수 있음
- 변수는 객체 변수와 클래스 변수로 나누어짐
- 메소드는 객체 메소드(instance method)와 클래스 메소드(class method)로 나누어짐
객체 변수
- 모델하는 대상 각각에 해당하는 데이터 나타냄
객체 메소드
- 객체에 적용되는 메소드
- 수행하는 역할에 따라 접근 메소드(accessor)와 변경자 메소드(mutator)로 나눌 수 있음
- 접근자 메소드
- 객체의 속성에 대한 값을 반환하는 메소드
- 변수의 값이나 계산되는 값을 반환할 수 있음
객체의 현 상태를 알고 싶은 경우 toString 메소드 사용
toString 메소드는 객체 변수들의 값들을 나타내는 문자열의 반환
toString 메소드는 한 객체가 문자열과 합쳐지거나 print나 println 메소드에 넘겨질 때 자동적으로 호출됨
따라서 객체들을 나타내는 클래스들은 대부분 toString 메소드를 정의함
- 변경자 메소드
- 객체 변수의 값을 바꾸는 메소드
- 보통 객체 변수의 값을 매개변수로 받는 값으로 변경
- 자주 객체 변수에 대한 접근을 제한하고 그에 따라 변수 값을 제어하기 위해 사용
학생의 성적 기록을 모델하는 클래스 작성한 프로그램(Student 클래스)
// 학생의 성적 기록을 나타냄
import java.util.Scanner;
public class Student {
// 객체 변수들
public String name; // 이름
public int assignmentScore; // 과제 점수
public int examScore; // 시험 점수
// 객체 메소드들
// 현 Student 객체의 정보에 대한 문자열을 반환함
public String toString()
{
String str = "";
str += "이름: " + name + "\n";
str += "과제 점수: " + assignmentScore + "\n";
str += "시험 점수: " + examScore + "\n";
str += "학점: " + examScore + "\n";
return str;
}
// 학생의 학점을 반환
public char getGrade()
{
char letterGrade; // 학생의 학점
double total; // 학생의 점수들의 총점
// 학생의 점수들의 총점을 계산함
total = assignmentScore*0.4 + examScore*0.6;
// 총점에 따라 학점을 부여함
if (total >= 90) letterGrade = 'A';
else if (total >= 80) letterGrade = 'B';
else if (total >= 70) letterGrade = 'C';
else if (total >= 60) letterGrade = 'D';
else letterGrade = 'F';
return letterGrade;
}
}
- public String name;
- public int assignmentScore;
- public int examScore;
- Student 클래스의 각 객체는 특정 학생의 이름, 과제 점수와 시험 점수를 저장함
- 따라서 클래스 내에 세 개의 객체 변수 선언문 존재
- 클래스 내에 총점과 학점을 저장하는 변수가 없음
- 특정 학생마다 총점과 학점 데이터가 있지만 이 값들은 필요할 때마다 과제 점수와 시험 점수를 이용하여 계산할 수 있기 때문에 객체 변수에 포함되지 않음
- 각 Student 객체는 toString과 getGrade 메소드에 의해 정의된 두 가지 행동을 함
- 첫 번째 행동: 각 객체와 연관된 모든 데이터를 문자열로 반환함
- 두 번째 행동: 각 객체의 학점을 계산하여 반환
클래스와 객체의 이용
- 클래스를 이용하기 위해 먼저 클래스의 한 실례인 객체를 만들어야 함
객체 만드는 과정
- 클래스의 한 실례인 객체를 참조하는 변수를 선언함
- new 라는 연산자를 이용하여 클래스의 한 객체를 만들고 이를 1번에서 선언한 참조변수가 가리키게 함
- 만들어진 객체를 이용하여 원하는 일을 수행하기 위해 객체의 절절한 메소드를 호출함
객체 메소드를 호출하는 구문 양식
- <객체를 가리키는 참조변수 명>.<객체 메소드명>(실제 매개변수 목록)
- 객체 메소드가 매겨변수를 가지고 있지 않다면 실제 매개변수 목록은 비게됨
- 한 클래스의 객체를 만들고 그 객체의 메소드들을 호출하는 문들은 main 메소드 안에 포함될 수 있음
- main 메소드는 자신만을 포함하는 새 클래스 안에 포함될 수 있음
- 주로 사용되며 새 클래스가 시작 프로그램으로서 실행됨
- 한 대상을 모델하는 클래스에 포함될 수도 있다
- 클래스별로 독립적으로 클래스를 시험하기 위해 사용됨
- main 메소드는 자신만을 포함하는 새 클래스 안에 포함될 수 있음
위에서 작성한 Student 클래스를 이용하는 프로그램
// Student 클래스와 그 메소드들을 사용함
public class StudentDriver {
public static void main(String[] args) {
// 첫 번째 학생을 나타내는 객체를 만듬
Student stud1 = new Student();
// 첫 번쨰 학생의 이름 정함
stud1.name = "선남";
// 첫 번째 학생의 과제 점수 줌
stud1.assignmentScore = 91;
// 첫 번째 학생의 시험 점수 줌
stud1.examScore = 84;
// 첫 번째 학생의 이름, 점수들과 학점 출력
System.out.println(stud1.toString());
// 두 번째 학생을 나타내는 객체 만듬
Student stud2 = new Student();
// 두 번쨰 학생의 이름 정함
stud2.name = "선녀";
// 두 번째 학생의 과제 점수 줌
stud2.assignmentScore = 86;
// 두 번째 학생의 시험 점수 줌
stud2.examScore = 95;
// 두 번째 학생의 이름, 점수들과 학점을 출력
System.out.println(stud2.toString());
}
}
실행 결과
이름: 선남 과제 점수: 91 시험 점수: 84 학점: 84 이름: 선녀 과제 점수: 86 시험 점수: 95 학점: 95 |
- Student 클래스로부터 한 객체를 생성하고 그 객체를 stud1이라는 참조변수가 가리키게 하는 문
- Student stud1 = new Student();
- stud1이 가리키는 객체는 name, assignmentScore와 examScore 변수를 가짐
- 각각의 변수를 나타내기 위해 이름은 <객체 참조 변수이름>.<객체 변수 이름> 과 같이함
- 예를 들면 stud1의 name 변수를 나타내기 위해 stud1.name이라고 함
- 이 변수의 값을 '선남'으로 정하는 문은 stud1.name = "선남";
요약
- 클래스는 객체의 설계도
- 여러 개의 객체들이 한 클래스로부터 만들어 질 수 있다
- 이 객체들을 구별하기 위해 이름(참조변수)를 사용함
- 클래스는 데이터들의 선언문들과 메소드들의 정의들로 구성됨
- 데이터와 메소드는 각각 모델하는 개체의 속성과 연산을 나타낸다
- 모든 객체는 특정 클래스의 한 실례이다
- 클래스는 머리부와 몸체로 이루어짐
- 객체 변수는 모델하는 대상 각각에 해당하는 데이터를 나타냄
- 객체 메소드는 객체에 적용되는 메소드
- 객체 메소드는 수행하는 역할에 따라 변경자 메소드와 접근자 메소드로 나눌 수 있음
- 변경자 메소드: 객체 변수의 값을 바꾸는 메소드
- 접근자 메소드: 객체 변수의 값을 반홚하거나 새로운 값을 계산하는 메소드
- 클래스로부터 객체가 생성될 때 객체 데이터에 대한 메모리 공간이 할당됨
- 클래스를 이용하기 위해 객체를 만들어야 함
- 접근 수정자는 클래스, 변수와 메소드 앞에 위치하여 그것들이 이용될 수 있는 접근의 범위를 나타냄
- 드라이버(Driver) 클래스는 main 메소드만을 포함하며 자주 다른 클래스들을 시험하기 위해 사용됨
'Java' 카테고리의 다른 글
접근자 메소드(get method) / 변경자 메소드(set method (1) | 2023.02.04 |
---|---|
접근 수정자(Access Modifier) public / private (0) | 2023.02.03 |
메소드 (0) | 2023.02.02 |
반복문 - for 문 (0) | 2023.02.01 |
반복문 - do 문 (0) | 2023.02.01 |