Chapter 5 클래스와 객체 1

Ruinak·2021년 5월 18일
0

Java

목록 보기
5/15
post-thumbnail

1. 객체지향 프로그래밍과 클래스

1-1 객체와 객체 지향 프로그래밍

  • 국어 사전에서 객체의 뜻을 찾아보면 '의사나 행위가 미치는 대상'이라고 설명합니다.
  • 즉 눈에 보이는 사물은 모두 객체라고 할 수 있습니다.
  • 눈에 안 보이는 것도 객체가 될 수 있습니다.
  • 주문, 생산, 관리 등 어떤 행동을 나타내는 단어도 객체가 될 수 있습니다.
  • 객체 지향 프로그램이란 '어떤 대상(객체)을 가지고 프로그래밍한다'는 개념을 기억해야 합니다.

1-2 생활 속에서 객체 찾아보기

  • 순서대로 일어나는 일을 시간순으로 프로그래밍하는 것을 절차 지향 프로그래밍이라 합니다.
    - '아침에 일어난다. 씻는다. 밥을 먹는다. 버스를 탄다. 요금을 지불한다. 학교에 도착한다.'
  • 객체를 정의하고 객체 간 협력을 프로그래밍하는 것을 객체 지향 프로그래밍이라 합니다.
    - 먼저 객체를 만들고 객체 사이에 일어나는 일을 구현한 것입니다.
    - 객체로 학생, 밥, 버스, 학교가 있습니다.

1-3 클래스(class)란?

  • 객체 지향 프로그램은 클래스를 기반으로 프로그래밍합니다.
  • 클래스는 객체의 속성과 기능을 코드로 구현한 것입니다.
  • 객체를 클래스로 구현하는 것을 '클래스를 정의한다'라고 합니다.
  • 클래스의 속성은 특성이라고도 하고 클래스 내부에 변수로 선언합니다.
  • 이렇게 선언하는 클래스의 속성을 '멤버 변수'라고 합니다.
  • 아래는 클래스를 정의하는 문법입니다.

예제 5-1 학생 클래스 만들기

public class Student {	// class는 클래스를 만드는 예약어, Student는 클래스 이름
	
	// 멤버 변수
	int studentID;		// 학번
	String studentName;	// 학생 이름
	int grade;		// 학년
	String address;		// 사는 곳
}
  • 클래스를 만들 때는 class 예약어를 사용합니다.
  • 클래스 이름은 Student라고 정했습니다.
  • { } 안에는 클래스 내용을 구현합니다.
  • 프로그램에서 사용할 객체의 속성을 클래스의 변수로 선언합니다.
  • 변수를 선언할 때는 각 변수 속성에 맞는 자료형을 사용해야 합니다.
  • 자바 프로그램은 모든 요소가 클래스 내부에 있어야 합니다.
  • 클래스 외부에는 package 선언과 import 문장 외에 아무것도 선언하지 않습니다.

클래스 이름 짓는 규칙

  • 자바에서 클래스 이름은 대문자로 시작합니다.
  • 소문자로 시작한다고 해서 오류가 발생하는 것은 아니지만, 대문자로 시작하는 것이 개발자들 사이의 규칙입니다.
  • 소셜 컨벤션(social convension)이 사회적 관습을 뜻하는 것처럼 코딩에서는 이런 규칙을
    코딩 컨벤션(coding convension)이라고 합니다.
  • 코딩 컨벤션이란 코딩을 할 때 읽기 쉽고 이해하기 쉽도록 정한 규칙입니다.

2. 클래스 살펴보기

2-1 클래스 속성을 구현하는 멤버 변수

  • 클래스 내부에 선언하여 객체 속성을 나타내는 변수를 멤버 변수(member variable)라 합니다.
  • 클래스에 선언하는 멤버 변수는 다른 말로 속성(property), 특성(attribute) 등으로 표현합니다.
  • 멤버 변수는 속성이 무엇이냐에 따라 알맞은 자료형을 선언해줘야 합니다.

예제 5-2 Person 클래스 만들기

public class Person {
	String name;	 // 이름
	int height;	 // 키
	double weight;	 // 몸무게
	char gender;	 // 성별
	boolean married; // 결혼 여부
}
  • Person 클래스의 멤버 변수로 이름, 키, 몸무게, 성별, 결혼 여부를 선언했습니다.
  • 멤버 변수를 선언할 때 int형, double형 같은 기본 자료형(primitive data type)으로 선언할 수도 있고, 또 다른 클래스형으로 선언할 수도 있습니다.
  • 클래스형이란 다른말로 객체자료형 또는 참조 자료형이라고 합니다.
  • 참조 자료형으로 사용하는 클래스는 String, Date와 같이 이미 JDK에서 제공하는 것일 수도 있고, 개발자가 직접 만든 Student나 Person 같은 클래스가 다른 클래스에서 사용하는 멤버 변수의 자료형이 될 수도 있습니다.

2-2 클래스 기능을 구현하는 메서드(method)

  • 클래스에서는 객체가 가지는 속성을 가지고 객체와 관련된 기능을 구현할 수 있습니다.
  • 클래스 내부에서 멤버 변수를 사용하여 클래스 기능을 구현한 것을 '멤버 함수(member function)' 또는 '메서드(method)'라고 합니다.

예제 5-3 학생 이름과 주소 출력하는 메서드 만들기

public class Student {	// class는 클래스를 만드는 예약어, Student는 클래스 이름
	
	// 멤버 변수
	int studentID;		// 학번
	String studentName;	// 학생 이름
	int grade;		// 학년
	String address;		// 사는 곳
	
	// 메서드 추가
	public void showStudentInfo() {
		// 이름, 주소 출력
		System.out.println(studentName + ", " + address);
	}
}
  • 위 코드를 보면 Student 클래스 안에 showStudentInfo( ) 메서드를 추가했습니다.

2-3 패키지(package)란?

  • 패키지는 간단히 말하면 클래스 파일의 묶음입니다.
  • 패키지를 만들면 프로젝트 하위에 물리적으로 디렉터리가 생성되며, 패키지는 계층 구조를 가질 수 있습니다.
  • 프로젝트를 수행할 때 패키지의 계층 구조를 구성하는 것은 전체 프로젝트의 소스 코드를 어떻게 관리할지와 관련이 있습니다.
  • 패키지가 단순히 클래스 묶음이 아닌 프로젝트 전체 소스 코드를 구성하는 계층 구조가 되고, 이 계층 구조를 잘 구성해야 소스 코드 관리와 유지 보수가 편리합니다.

3. 메서드

  • 메서드는 함수(function)의 한 종류입니다.

3-1 함수란?

  • 함수란 '하나의 기능을 수행하는 일련의 코드'를 말합니다.
  • 함수는 어떤 기능을 수행하도록 미리 구현해 놓고 필요할 때마다 호출하여 사용할 수 있습니다.

3-2 함수의 입력과 반환

  • 함수는 이름이 있고 입력 값과 결과 값을 가집니다.
  • 함수에 이름을 붙일 때는 의미를 알 수 있는 단어를 사용하는 것이 좋습니다.
  • 함수의 입력으로 받는 변수를 '매개변수'라고 합니다.
  • 함수를 수행한 후 결과로 되돌려 주는 값을 '반환 값'이라고 부름

3-3 함수 정의하기

  • 함수가 하는 일을 코드로 구현하는 것을 '함수를 정의한다'라고 합니다.
  • 아래는 '더하기 함수'를 정의한 예제입니다.

함수 이름 add

  • 함수 이름은 add라고 썼습니다.
  • 위 예제에서 ① 위치가 함수 이름을 적는 부분입니다.
  • 함수 이름은 변수 이름처럼 프로그래머가 임의로 만들면 되는데, 함수 기능과 관련 있게 만들어야 나중에 호출하거나 이해하기 좋습니다.

매개변수 num1, num2

  • add 함수는 두 값을 더하는 일을 합니다.
  • 덧셈을 수행하기 위해서는 먼저 함수에 두 값이 입력되어야합니다.
  • 이 두 값은 함수를 호출할 때 괄호 안의 자료형에 맞게 함수에 전달됩니다.
  • 함수 내부에서 사용할 괄호 안의 변수를 매개변수라고 합니다.
  • 위 예제에서는 ② num1과 num2가 매개변수입니다.
  • 함수에 전달할 값이 굳이 필요하지 않은 경우에는 매개변수가 필요 없습니다.

return 예약어와 반환형

  • add( ) 함수를 수행한 후 결과 값은 변수 result에 저장됩니다.
  • result에 저장된 결과 값은 함수를 호출했을 때 반환되는 값이므로 '반환 값'이라고 부릅니다.
  • '이 함수의 결과 값을 반환합니다'를 뜻하는 예약어가 바로 return입니다.
  • ③ return 예약어를 사용하여 result 값을 반환하는 것입니다.
  • 반환 값의 자료형을 반환형이라고 하는데 ④ 위치에 써 줍니다.
  • 이 함수에서 변수 result의 반환형은 정수형이므로 ④ 위치에 int라고 적었습니다.
  • 반환 값이 없는 경우에는 ④ 위치에 void('반환할 값이 없다'라는 의미)라고 적어줍니다.
  • return 예약어는 함수 수행ㅇ르 끝내고 프로그램 흐름 중에서 호출한 곳으로 다시 되돌아갈 때도 사용할 수 있습니다.

3-4 함수 호출하고 값 반환하기

  • 함수를 사용하는 것을 '함수를 호출한다'라고 합니다.

예제 5-4 함수 구현하고 호출하기

public class FunctionTest {
	public static void main(String[] args) {
		int num1 = 10;
		int num2 = 20;
		
		int sum = add(num1, num2);  // add( ) 함수 호출
		System.out.println(num1 + " + " + num2 + " = " + sum + "입니다.");
	}
    
	// add( ) 함수
	public static int add(int n1, int n2) {
		int result = n1 + n2;
		return result;
	}
}

  • 위 코드는 add( ) 함수를 구현했습니다.
  • add( ) 함수는 두 개의 매개변수에 int형 값을 전달받아 두 수의 합을 돌려줍니다.
  • 결과 값이 정수이기 때문에 반환형이 int형입니다.
  • 반환 값이 int형이기 때문에 결과 값이 저장되는 sum 변수 앞에 int라고 써주었습니다.

매개변수 살펴보기

  • 위 예제를 보면 add( ) 함수에서 사용한 매개변수 이름과 add( ) 함수를 호출할 때 사용한 매개변수의 이름이 다릅니다.
  • 함수를 호출할 때 사용하는 변수 이름과 호출되는 함수에 사용하는 변수는 서로 다른 변수이므로 이름이 같아도 되고 달라도 상관없습니다.

3-5 함수 호출과 스택(stack) 메모리

  • 함수를 호출하면 그 함수만을 위한 메모리 공간이 할당 되는데, 이 메모리 공간을 스택(stack)이라고 부릅니다.
  • add( ) 함수를 호출하면서 메모리를 생성 하는 과정은 아래와 같습니다.
  • 함수가 호출되면 그 함수가 사용할 메모리 공간이 스택에 생성됩니다.
  • 프로그램을 시작할 때 main( ) 함수부터 호출하기 때문에 가장 먼저 main( )함수에 포함된 변수 num1, num2, sum을 저장할 메모리 공간이 생성됩니다.
  • main( ) 함수에서 add( ) 함수를 호출하면 add( ) 함수를 저장할 메모리 공간이 스택에 새롭게 생성됩니다.
  • add( ) 함수 수행이 끝나고 함수에 할당했던 메모리 공간을 해제하는 과정은 아래와 같습니다.
  • add( ) 함수 수행이 끝나고 결과 값이 반환되면 add( ) 함수가 사용하던 메모리 공간은 자동으로 사라집니다.
  • 프로그램에서 여러 함수를 사용하는 경우에 함수를 호출한 순서대로 메모리 공간이 만들어지고 맨 마지막에 호출한 함수부터 반환됩니다.
  • 메모리 공간도 맨 마지막에 추가된 것부터 스택에서 사라집니다.
  • A( )→B( )→C( ) 함수의 순서로 호출했다면 C( )→B( )→A( ) 순서로 반환되고 스택 메모리도 이 순서대로 소멸됩니다.
  • main( ) 함수에서 사용하는 num1, num2 변수와 add( ) 함수에서 사용하는 n1, n2 변수는 서로 다른 메모리 공간을 사용하므로 이름이 같든 다르든 상관없습니다.
  • 함수 내부에서만 사용하는 변수를 지역 변수라고 합니다.
  • 지역 변수는 스택 메모리에 생성됩니다.

3-6 함수의 장점

  • 함수를 사용하면 기능을 나누어 코드를 효율적으로 구현할 수 있습니다.
  • 기능을 분리해서 구현하면 프로그램 코드의 가독성이 좋아집니다.
  • 기능별로 함수를 구현해 놓으면 같은 기능을 매번 코드로 만들지 않고 그 기능의 함수를 호출하면 되므로 편리합니다.
  • 중복되는 코드를 막을 수 있습니다.
  • 프로그램을 실행할 때 생긴 오류를 수정하는 디버깅 작업을 할 때도 편리합니다.
  • 하나의 기능이 하나의 함수로 구현되어 있기 때문에 오류가 난 기능만 찾아서 수정하면 됩니다.

하나의 함수에 하나의 기능 구현하기

  • 하나의 함수에 여러 기능이 섞여 있으면 위에서 이야기한 함수의 장점을 활용할 수 없습니다.
  • 무조건 소스 코드를 나누어 호출한다고해서 함수를 구현하는 것이 아닙니다.
  • 필요한 기능 함수를 만들고, 그 이름에 맞는 하나의 기능을 구현하는 것이 중요합니다.

3-7 클래스 기능을 구현하는 메서드

  • 자바 프로그램에는 클래스 내부에서 사용하는 멤버 함수가 있는데, 이를 메서드(method)라고 합니다.
  • 메서드는 멤버 변수를 사용하여 클래스의 기능을 구현합니다.
  • 메서드는 함수에 객체 지향 개념이 포함된 용어로 이해하면 됩니다.
  • 함수의 스택 메모리 사용 방법과 함수의 장점 등도 모두 메서드에 동일하게 적용됩니다.

예제 5-5 학생 이름을 반환하는 메서드

public class Student {	// class는 클래스를 만드는 예약어, Student는 클래스 이름
	
	// 멤버 변수
	int studentID;		// 학번
	String studentName;	// 학생 이름
	int grade;		// 학년
	String address;		// 사는 곳
	
	// 학생의 이름을 반환하는 메서드
	public String getSutentName() {
		return studentName;
	}
}
  • 메서드 이름은 해당 클래스를 사용하는 코드의 입장에서 짓는 것이 좋습니다.

예제 5-6 학생 이름을 부여하는 메서드

public class Student {	// class는 클래스를 만드는 예약어, Student는 클래스 이름
	
	// 멤버 변수
	int studentID;		// 학번
	String studentName;	// 학생 이름
	int grade;		// 학년
	String address;		// 사는 곳
	
	// 학생의 이름을 반환하는 메서드
	public String getSutentName() {
		return studentName;
	}
	
	// 학생 이름을 멤버 변수에 대입하는 메서드
	// 학생 이름을 매개변수로 전달
	public void setStudentName(String name) {	
		studentName = name;
	}
}
  • setStudentName( ) 메서드는 Student 클래스를 사용하는 다른 코드에서 학생 이름을 새로 지정하거나 바꾸어 줍니다.
  • studentName 값을 지정하는(set) 기능을 제공하는 것입니다.

자바의 이름 짓기 규약

  • 클래스 이름은 대문자로 시작합니다.
  • 하나의 자바 파일에 클래스가 여러 개 있을수도 있지만, public 클래스는 단 하나이고 public 클래스 이름과 자바 파일 이름은 같아야 합니다.
  • 패키지 이름은 모두 소문자로 만듭니다.
  • 변수와 메서드 이름은 소문자로 시작하며, 이름이 길어지는 경우에 중간에 새 단어로 바뀔 때마다 대문자를 써 줌으로써 가독성을 좋게 합니다.(낙타 표기법)

4. 클래스와 인스턴스

4-1 클래스 사용과 main( ) 함수

프로그램을 시작하는 main ( ) 함수

  • 클래스를 사용하여 프로그램을 실행하려면 먼저 main( ) 함수를 알아야 합니다.
  • main( ) 함수는 자바 가상 머신(Java Virtual Machine : JVM)이 프로그램을 시작하기 위해 호출하는 함수입니다.
  • 클래스 내부에 만들지만, 클래스의 메서드는 아닙니다.
  • main( ) 함수에서 클래스를 사용하는 방법은 두 가지가 있습니다.
    1) 우리가 만든 클래스 내부에 main() 함수를 만드는 것
    2) 외부에 테스트용 클래스를 만들어서 사용하는 것

Student 클래스에 main( ) 함수 포함하기

예제 5-7 Student 클래스에 main( ) 함수 추가하기

package classpart;

public class Student {	// class는 클래스를 만드는 예약어, Student는 클래스 이름
	
	// 멤버 변수
	int studentID;		// 학번
	String studentName;	// 학생 이름
	int grade;			// 학년
	String address;		// 사는 곳
	
	// 학생의 이름을 반환하는 메서드
	public String getSutentName() {
		return studentName;
	}
	
	public static void main(String[] args) {
		Student studentKim = new Student();
		studentKim.studentName = "김독자";
		
		System.out.println("studentKim.studentName : " + studentKim.studentName);		
		System.out.println("studentKim.getStudentName() : " + studentKim.getStudentName());
	}
}

  • 위와 같이 클래스 내부에 main( ) 함수를 만들면 이 클래스가 프로그램의 시작 클래스가 됩니다.
  • 클래스가 제대로 수행되는지 알아보기 위해 클래스 내부에 main( ) 함수를 만들고 직접 실행할 수 있습니다.

4-2 new 예약어로 클래스 생성하기

  • 클래스를 사용하려면 먼저 클래스를 생성해야 합니다..
  • 클래스를 생성하는 코드는 아래와 같습니다.
  • 자바에서 클래스를 생성할 때는 new 예약어를 사용하고 이어서 생성자를 써 줍니다.
  • 클래스 자료형 변수를 선언하고 new 예약어로 생성자를 호출하여 대입하면 새로운 클래스가 생성됩니다.
  • 클래스가 생성된다는 것은 클래스를 실제 사용할 수 있도록 메모리 공간(힙 메모리)을 할당 받는다는 뜻입니다.
  • 실제로 사용할 수 있도록 생성된 클래스를 '인스턴스'라고 합니다.
  • 인스턴스를 가리키는 클래스형 변수를 '참조 변수'라고 합니다.
  • 위 코드는 Student 클래스 자료형으로 studentKim 변수를 선언하고 new Student( );로 Student 클래스를 생성하여 studentKim에 대입한다는 뜻입니다.

4-3 인스턴스와 참조 변수

객체, 클래스, 인스턴스

  • 객체란 '의사나 행위가 미치는 대상'이며 이를 코드로 구현한 것이 클래스이고, 그리고 클래스가 메모리 공간에 생성된 상태를 인스턴스라고 합니다.
  • 생성된 클래스의 인스턴스를 객체라고 합니다.
  • 클래스의 생성자를 호출하면 인스턴스가 만들어집니다.
  • 클래스는 하나이지만 이 클래스로부터 여러개의 각각 다른 인스턴스를 생성할 수 있습니다.

예제 5-8 인스턴스 여러 개 생성하기

public class StudentTest {
	public static void main(String[] args) {
		Student student1 = new Student();
		student1.studentName = "유상아";
		System.out.println("student1.getStudentName : "+ student1.getStudentName());
		Student student2 = new Student();
		student2.studentName = "이지혜";
		System.out.println("student2.getStudentName : "+ student2.getStudentName());
	}
}

  • 생성자를 두 번 사용해서 서로 다른 변수 이름으로 클래스를 두 개 생성했습니다.
  • 즉 서로 다른 인스턴스가 두 개 생성되었습니다.

참조 변수 사용하기

  • 참조 변수를 사용하면 인스턴스의 멤버 변수와 메서드를 참조하여 사용할 수 있는데 이때 도트( . ) 연산자를 사용할 수 있습니다.
  • new Student( )를 선언하면 Student 하나아 생성되는데 각 Student는 studentID, studentNam 등의 멤버 변수를 가지고 있습니다.
  • 이들 변수를 저장할 공간이 있어야 하는데, 이때 사용하는 메모리가 힙 메모리(heap memory)입니다.

4-4 인스턴스와 힙 메모리

  • 인스턴스가 생성되는 과정
    1) new Student( )를 선언하면 Student 하나가 생성됩니다.
    2) 생성된 Student는 studentID, studentName 등의 멤버 변수를 가지고 있습니다.
    3) 이 변수를 저장할 공간이 있어야합니다.
  • 바로 이 때 사용하는 메모리가 힙 메모리(heap memory)입니다.
  • 클래스 생성자를 하나 호출하면 인스턴스가 힙 메모리에 생성되는 것입니다.
  • 위와 같이 생성된 클래스를 studentKim 변수에 대입하면, 인스턴스가 저장된 메모리를 studentKim 변수가 가리킵니다.
  • 지역 변수 studentKim 생성된 인스턴스를 대입하는 것은 studentKim에 인스턴스가 생성된 힙 메모리의 주소를 대입한다는 것과 같은 의미입니다.
  • 클래스가 생성될 때마다 인스턴스는 다른 메모리 공간을 차지하므로, 클래스에 선언한 멤버 변수를 다른 말로 '인스턴스 변수'라고도 부릅니다.

힙 메모리란?

  • 힙(heap)은 프로그램에서 사용하는 동적 메모리(dynamic memory) 공간을 말합니다.
  • 일반적으로 프로그램은 스택, 힙, 데이터 이렇게 세 영역을 사용하는데, 객체가 생성될 때 사용하는 공간이 힙입니다.
  • 힙은 동적으로 할당되며 사용이 끝나면 메모리를 해제해 주어야 합니다.
  • 자바에서는 가비지 컬레터(garbage collector)가 자동으로 메모리를 해제해 줍니다.

예제 5-9 참조 값 출력하기

public class StudentTest2 {
	public static void main(String[] args) {
		Student student1 = new Student();
		student1.studentName = "유상아";
		
		Student student2 = new Student();
		student2.studentName = "이지혜";
		
		System.out.println("student1 : " + student1);
		System.out.println("student2 : " + student2);
	}
}

  • 참조 변수는 힙 메모리에 생성된 인스턴스를 가리킵니다.
  • 힙 메모리에 생성된 인스턴스의 메모리 주소는 참조 변수에 저장됩니다.
  • 출력 내용을 확인해 보면 '클래스이름@주소 값'입니다.
  • 여기서 나오는 주소 값은 다른 말로 해시 코드(hash code) 값이라고도 합니다.
  • 이 값은 자바 가상 머신(JVM)에서 객체가 생성되었을 때 생성된 객체에 할당하는 가상 주소 값입니다.
  • 위 예제에서 student1을 참조 변수, 주소 값을 참조 값이라고 합니다.

4-5 객체 지향 프로그램 관점 용어 정리

5. 생성자

5-1 생성자란?

예제 5-10 생성자 만들기 및 테스트하기

public class Person {
	String name;	 
	float height;
	float weight;
}

==================================================

public class PersonTest {
	public static void main(String[] args) {
		Person personLee = new Person();
	}
}
  • 자바에서 클래스를 생성할 때 사용하는 Person( ) 같은 함수를 생성자라고 합니다.
  • 클래스의 멤버 변수는 메서드에 의해 값이 변경될 수도 있지만, 처음 클래스를 생성할 때 값을 정해야 하는 경우도 있습니다.
  • 생성자가 하는 일은 클래스를 처음 만들 때 멤버 변수나 상수를 초기화하는 것입니다.

디폴트 생성자

  • 생성자는 클래스를 생성할 때만 호출합니다.
  • 생성자 이름은 클래스 이름과 같고, 생성자는 반환 값이 없습니다.
  • 생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어 줍니다.
  • 위와 같이 자동으로 만들어주는 생성자를 디폴트 생성자(default constructor)라고 합니다.
  • 디폴트 생성자는 매개변수가 없고 구현 코드도 없습니다.

예제 5-11 디폴트 생성자(default constructor)

public class Person {
	String name;	 
	float height;
	float weight;

	public Person( ) {	}	// 자바 컴파일러가 자동으로 제공하는 디폴트 생성자
}

5-2 생성자 만들기

  • 필요한 경우 프로그래머가 직접 생성자를 구현할 수도 있습니다.
  • 생성자는 주로 멤버 변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버 변수 값들을 초기화하는 역할을 합니다.
  • 인스턴스가 생성됨과 동시에 멤버 변수의 값을 지정하고 인스턴스를 초기화하기 위해 생성자를 직접 구현하여 사용합니다.

예제 5-12 디폴트 생성자 직접 추가하기

public class Person {
	String name;	 
	float height;
	float weight;

	// 사람 이름을 매개변수로 입력받아서 Person 클래스를 생성하는 생성자
	public Person(String pname) {	
		name = pname;
	}	
}
  • 새로 만든 생성자는 문자열 String형 매개변수를 하나 입력받아서 이름을 지정합니다.
  • 자바 컴파일러는 생성자가 하나도 없는 경우에만 디폴트 생성자를 제공합니다.
  • 예제 5-11의 예제는 에러가 발생할 것이며 이 에러를 없애기 위해서는 디폴트 생성자를 만들어주거나, 매개변수가 있는 생성자로 호출해줘야 합니다.

5-3 생성자 오버로드

  • 클래스에 생성자가 두 개 이상 제공되는 경우를 생성자 오버로드(constructor overload)라고 합니다.
  • 필요에 따라 매개변수가 다른 생성자를 여러 개 만들 수 있습니다.
  • 클래스에 생성자를 여러 개 제공하면 이 클래스를 사용하는 코드에서는 원하는 생성자를 선택해 사용할 수 있습니다.
  • this 예약어를 사용해서 꼭 필요한 매개변수를 지정해 생성자를 만들면 디폴트 생성자를 구현하지 않아도 됩니다.

예제 5-14 생성자 사용하기

public class Person {
	String name;	 
	float height;
	float weight;
	
	// 빈 생성자
	public Person() { }
	// 사람 이름을 매개변수로 입력받는 생성자
	public Person(String pname) {	
		name = pname;
	}
	
	// 이름, 키, 몸무게를 매개변수로 입력 받는 생성자
	public Person(String pname, float pheight, float pweight) {	
		name = pname;
		height = pheight;
		weight = pweight;
	}
}
  • 위와 같은 Person 클래스가 있을 떄 이 클래스를 사용하는 PersonTest.java 클래스는 아래와 같이 구현할 수 있습니다.

예제 5-15 테스트 클래스 구현하기

public class PersonTest {
	public static void main(String[] args) {
		// 디폴트 생성자로 클래스를 생성한 후 인스턴스 변수 값을 따로 초기화
		Person personC = new Person();
		personC.name = "척준경";
		personC.height = 186.3f;
		personC.weight = 77.4f;
		
		// 인스턴스 변수 초기화와 동시에 클래스 생성
		Person personK = new Person("계백", 176.2f, 72.3f);
	}
}
  • 위 예제는 디폴트 생성자를 사용하는 경우와 매개변수가 있는 생성자를 사용하는 두 가지 경우를 보여줍니다.

6. 참조 자료형

6-1 참조 자료형이란?

  • 크기가 정해진 기본 자료형(int, char, float, double 등)으로 선언하는 변수가 있고, 클래스 자료형으로 선언하는 참조 자료형 변수가 있습니다.
  • 객체 지향 프로그래밍을 시작할 때는 일단 클래스를 어떻게 만들지 생각합니다.
  • 클래스가 제공해야 할 멤버 변수와 메서드를 생각해 볼 수 있습니다.

예제 5-16 학생 클래스 만들기(1)

public class Student1 {	
	int studentID;		
	String studentName;	
	int koreaScore;
	int mathScore;
}
  • String이 JDK(Java Development Kit)에서 제공하는 참조 자료형입니다.
  • 나머지 변수는 기본 자료형을 사용했습니다.

예제 5-17 학생 클래스 만들기(2)

public class Student2 {	
	int studentID;		
	String studentName;	
	int koreaScore;
	int mathScore;
	
	// 과목 이름 변수 추가
	String koreaSubject;
	String mathSubject;
}
  • 이 클래스는 학생에 대한 클래스인데, 과목에 대한 변수가 계속 늘어나고 있습니다.
  • 위 문제를 해결하기 위해 과목의 이름과 성적을 Subject라는 클래스로 분리하고, 학생에 Subject 변수를 각 과목별로 추가해줍니다.

예제 5-18 과목클래스 & 학생 클래스 만들기(3)

public class Subject {	
	String SubjectName;	
	int scorePoint;
}
  • 과목을 의미하는 Subject라는 클래스를 새로 만들었습니다.
  • Subject 클래스는 과목의 이름과 점수를 멤버 변수로 가지고 있습니다.
public class Student3 {	
	int studentID;		
	String studentName;	
	// Subject 형을 사용하여 선언
	Subject korea;
	Subject math;
}
  • Subject로 클래스를 분리하면 subjectName은 Subject 클래스에 선언하면 됨
  • 국어 과목은 korean.subjectName으로 사용하고, 수학 과목은 math.subjectName으로 사용할 수 있어 편리함

7. 정보 은닉

7-1 접근 제어자 살펴보기

  • 객체 지향 프로그램에서는 예약어를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정할 수 있습니다.
  • 이러한 예약어를 '접근 제어자(access modifier)'라고 함
  • 앞에서 만든 예제 Student.java 코드의 모든 변수에는 public 예약어가 있습니다.
  • public이라고 선언한 변수나 메서드는 외부 클래스에서 접근이 가능하며 외부 클래스가 사용할 수 있다는 뜻입니다.
  • private로 선언한 변수나 메서드는 외부 클래스에서 사용할 수 없습니다.

7-2 get( ), set( ) 메서드

  • private로 선언한 변수를 외부 코드에서 사용하기 위해 값을 얻는 기능을 하는 get( ), 값을 지정하는 기능을 하는 set( ) 메서드를 사용합니다.

7-3 정보 은닉이란?

  • 클래스 내부에서 사용할 변수나 메서드는 private로 선언해서 외부에서 접근하지 못하도록 하는 것을 객체 지향에서는 '정보 은닉(information hiding)'이라고 합니다.
  • 정보 은닉은 객체 지향 프로그래밍의 특징 중 하나이며 자바에서는 접근 제어자를 사용하여 정보 은닉을 구현합니다.

7-4 접근 제어자

  • 자바에서 사용하는 접근 제어자를 정리하면 아래와 같습니다.
profile
Nil Desperandum <절대 절망하지 마라>

0개의 댓글