거북이처럼 천천히

Java - 클래스 정리 (1) 본문

Back-end/Java 개념

Java - 클래스 정리 (1)

유로 청년 2022. 6. 26. 18:18

자바는 객체 지향 프로그래밍(OOP, Object-Oriented Programming)으로써 모든 데이터를 객체(Object)로 취급한다. 

이때, 객체를 만들어 내기 위한 설계도, 틀과 비슷한 개념이 클래스(class)이다. 


클래스(class)

자바에서 클래스는 객체를 정의하기 위한 틀, 객체를 생성하기 위한 설계도와 같은 의미로 사용한다.

따라서 객체를 생성하기 전, 객체를 정의하기 위한 틀인 클래스를 정의할 필요가 있다.

 

클래스와 객체와의 관계를 예시로 표현하자면 다음과 같다.

  • 클래스 : 과자를 만들기 위한 틀
  • 객체(=인스턴스) : 틀을 통해 만들어진 과자

 

클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성되어있다.

 


클래스 생성

목표: 사람들의 이름과 전화번호가 담긴 전화부를 클래스를 이용하여 만들고자 한다.

package Chapter2;

public class PersonInfo {
	public String name;  // field, data member;
	public String phoneNumber; // field, data member;
}

※ 일반적으로 하나의 자바 파일에 하나의 클래스를 작성하는 것이 원칙이며, 파일 이름과 클래스명과는 반드시 일치해야

    한다.

 

"PersonInfo" 클래스를 생성하고, PersonInfo 클래스가 name과 phoneNumber이라는 String 변수를 갖도록 정의하였다. 하나의 클래스에 두 개의 String 변수를 정의한 이유는 서로 관련있는 데이터들을 하나의 단위로 묶어 관리하기 위함이다.

 


사용자 정의 타입

이번에는 정의된 PersonInfo 클래스를 이용하여 사용자의 데이터들을 저장하고자 한다. 하지만, 그전에 앞서 알아 두어야 할 개념이 있다. 바로 클래스는 int와 double 등처럼 하나의 데이터 타입이라는 것이다.

int age = 30;
double pi = 3.14;

PersonInfo person1 <-  {"Jimi", 010-1234-5678}

즉, PersonInfo 타입에 저장하는 것이 아니라 PersonInfo 타입인 person1 변수에 데이터를 저장한다. 이것은 마치 int 타입에 데이터를 저장하는 것이 아니라 int형인 age 변수에 데이터를 저장하는 것과  같다.

 

다만, int, double인 경우 자바에서 미리 정해놓은 타입이지만, PersonInfo 타입은 사용자가 정의한 새로운 타입이기 때문에 사용자가 새로 정의한 타입이라는 의미에서 "사용자 정의 타입"이라고 부른다.

 


인스턴스 생성 (객체 생성)

PersonInfo person1;

사실은 위 코드처럼 사용자 정의 타입과 객체 이름을 정의한다고 해서 바로 사용할 수 있는 것은 아니다. 위 코드는 "사용한 변수의 이름이 "person1"이며, 데이터 타입은 "PersonInfo1"이다."라는 것을 알려줄 뿐, 아직 객체를 생성한 것이 아니다.

 

이것은 마치 배열 생성하는 것과 같다. 배열 생성함에 있어 배열의 타입과 이름을 정의할 뿐만 아니라 new 키워드를 사용하여 생성할 필요가 있는 것과 같다. 

int[] score; // 아직 배열 생성하지 않았다.
int[] score = new int[10]; 
// "int형 배열을 생성하며, 배열의 이름은 score이고, 배열의 사이즈은 10으로 생성"을 의미

 

따라서 클래스 PersonInfo를 이용하여 객체(=인스턴스)를 생성하기 위해서 아래와 같이 작성해야한다.

PersonInfo person1 = new PersonInfo();

// (사용자 정의 타입) (객체명) = new (사용자 정의 타입) ();

인스턴스 변수 활용

이번에는 인스턴스 변수를 활용하여 한 사람의 이름과 전화번호를 저장해보자

package Chapter2;

public class Code01 {
	public static void main(String[] args) {
		PersonInfo person1 = new PersonInfo();
		
		person1.name = "Jimi";
		person1.phoneNumber = "01012345678";
		
		System.out.printf("이름: %s, 전화번호: %s\n", person1.name, person1.phoneNumber);
	}
}
이름: Jimi, 전화번호: 01012345678

(.) 도트를 통해 person1 객체의 인스턴스 변수에 접근할 수 있었으며, 인스턴스 변수의 값을 수정한 뒤, 출력하였다.


사용자 정의 타입 배열

int타입 배열, String타입 배열 처럼 사용자 정의 타입 배열 또한 정의하고, 사용할 수 있다.

PersonInfo[] people = new PersonInfo[100];

 

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class Code01 {
	public static void main(String[] args) {
		// 객체 배열 생성 (1단계)
		PersonInfo[] people = new PersonInfo[100];
		int count = 0;
		
		try {
			Scanner inFile = new Scanner(new File("input.txt"));
			
			while(inFile.hasNext()) {
				// 배열 원소의 객체 생성 (2단계)
				people[count] = new PersonInfo();
				people[count].name = inFile.next();
				people[count].phoneNumber = inFile.next();
				
				count++;
			}
		}catch(FileNotFoundException e) {
			System.out.println("Can't read File");
			System.exit(0);
		};
		
		// 결과 출력
		for(int i=0; i<count; i++)
			System.out.printf("%d 번째 사람: %s, 연략처: %s \n", i, people[i].name, people[i].phoneNumber);
	}
}
0 번째 사람: Jimi, 연략처: 010-1234-6894 
1 번째 사람: Park, 연략처: 1234-123-4565 
2 번째 사람: Kim, 연략처: 1452-7456-155 
3 번째 사람: Jeon, 연략처: 1453-112-1545 
4 번째 사람: Yumi, 연략처: 854-1533-5515

 

※ 단, 객체 배열을 생성함에 있어 new 키워드를 사용하여 생성하는 과정이 두 번 시행한다.

    1) 객체 배열 생성하기 위해서 new 키워드 사용 { PersonInfo[] people = new PersonInfo[100] }

    2) 객체 배열 생성했다고 해서 바로 각각의 객체 필드에 대입하는 것이 아니라 각각의 객체 필드에 대입하기 전에 

        다시 한 번 new 키워드를 이용하여 배열 원소(객체)를 생성 { people[count] = new PersonInfo() }


Reference

  • https://wikidocs.net/280
  • http://www.tcpschool.com/java/java_class_intro
  • Java로 배우는 자료 구조