Programming 기초/Java

[Java] 클래스, 인스턴스, 패키지, 상속

뭉제 2023. 2. 27. 16:54
목차
1. 클래스와 인스턴스
2. 패키지
3. 상속
4. 상속 관계의 특성

 

 

자바는 객체 지향 언어이다.

객체 지향 프로그래밍(Object-Oriented Programming, OOP)에서는 모든 데이터를 객체로 취급하며,

객체의 상태와 행동을 구체화하는 형태로 프로그래밍을 진행한다.

 

 

클래스와 인스턴스


객체(object)

· 데이터(실체)와 그 데이터에 관련된 동작(절차, 방법, 기능)을 모두 포함한 개념

· 소프트웨어 세계에 구현할 대상

 

=> 같은 성질(구조와 형태)을 가지는 객체는 클래스로 정의하고,

     같은 클래스에 속하는 객체는 그 클래스의 인스턴스라고 한다. 

 

ex) 기차역에서 승차권 발매할 때

-> 손님(실체)과 승차권 주문(동작)은 하나의 객체 

-> 역무원(실체)과 승차권 발매(동작)는 하나의 객체 

 

 

클래스(class)

· 객체를 생성하기 위한 틀(template) 혹은 설계도

· 연관된 변수와 메소드의 집합

  - 필드(field): 객체의 상태 -> 객체 내에 값을 저장하는 변수(variable)

  - 메소드(method): 객체의 행동 -> 특정 작업을 수행하기 위한 명령문의 집합

 

 

인스턴스(instance)

· 클래스에 속하는 각 객체(하나의 클래스에서 생성된 객체) 

· 설계도(클래스)에 따라 소프트웨어 세계에 구현된 실체(메모리에 할당된 상태) 

 

* 인스턴스화(instantiation): 추상적인 개념인 클래스에서 실제 객체를 생성하는 것

 

ex) 목록(list)이라는 클래스를 정의한 후, 본인 목록(my list)이라는 객체를 생성(메모리 할당)하면 그 클래스의 인스턴스가 생성된다.

 

=> 하나의 클래스에서 수많은 인스턴스를 생성할 수 있다.

=> 생성된 인스턴스는 독립된 메모리 공간을 가질 수 있다.

=> 인스턴스는 모두 같은 필드와 메소드를 가지지만, 각 인스턴스마다 가지고 있는 속성의 값은 다르다.

 

 

즉, 클래스는 설계도이고 인스턴스는 구체적인 제품이라 할 수 있다.

 

ex) 붕어빵 틀은 클래스이고, 붕어빵은 객체이다.

      붕어빵이 만들어지는 과정이 인스턴스화이며, 틀을 이용해 만들어진 각각의 붕어빵들이 인스턴스이다.

   

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;

public class InstanceApp {
	public static void main(String[] args) throws IOException {
		PrintWriter p1=new PrintWriter("result1.txt");
		p1.write("Hello 1");
		p1.close();
		
		PrintWriter p2=new PrintWriter("result2.txt");
		p2.write("Hello 2");
		p2.close();
	}
}

· new 키워드를 통해 인스턴스를 생성

· PrintWriter 클래스는 java.io 패키지에 속해 있다. -> import 구문 이용

· PrintWriter 인스턴스를 생성할 때 사용할 파일이 존재하지 않는다면 에러 발생

· Add throws declaration을 이용해서 에러 핸들링 

 

 

<참고> 객체와 인스턴스의 차이
PrintWriter p1=new PrintWriter("result1.txt"); 이렇게 만들어진 p1은 객체이다. 그리고 p1이라는 객체는 PrintWriter의 인스턴스이다. 인스턴스라는 말은 특정 객체(p1)가 어떤 클래스(PrintWriter)의 객체인지를 관계 위주로 설명할 때 사용된다.
즉, "p1은 인스턴스"보다는 "p1은 객체"라는 표현이 "p1은 PrintWriter의 객체"보다는 "p1은 PrintWriter의 인스턴스"라는 표현이 더 잘 어울린다.

 

※ 인스턴스를 만드는 이유

· 인스턴스는 객체를 다양한 상태에서 사용하고, 기능을 재사용할 경우가 많은 상황에서 유용하다.

· 자바 API 설명서에 Constructor Summary가 존재하는 클래스는 인스턴스를 생성할 수 있다. 

PrintWriter 클래스

출처

https://cerulean85.tistory.com/149

http://word.tta.or.kr/main.do

https://wikidocs.net/214

 

패키지


패키지(package)

· 연관된 클래스와 인터페이스들을 하나의 묶음으로 정리한 것(하나의 디렉토리)

 

=> 하나의 패키지에 속한 클래스 파일은 모두 해당 패키지 이름의 디렉토리에 포함되어 있다.

=> 패키지는 다른 패키지를 포함할 수 있으며, 이때 디렉토리의 계층구조는 점(.)으로 구분된다.

 

ex) java.lang.String 클래스는 java.lang 패키지에 속해있다. java.lang 패키지에는 Math, System 등 프로그래밍에 필요한 기본적인 클래스와 인터페이스들이 포함되어 있다.

 

** java.lang 패키지는 import 문 없이 사용 가능

 

 

[패키지 사용하기]

1. import 선언 X

· 클래스의 경로명을 입력해서 사용

java.util.Scanner scanner=new java.util.Scanner(System.in);

 

2. import선언

· 패키지의 모든 클래스 사용 -> import 패키지이름.*;

· *은 패키지 내의 모든 클래스만을 의미하며, 하위 패키지의 클래스까지 포함하지 않는다.

import java.util.*; //java.util 패키지의 모든 클래스

 

· 패키지의 특정 클래스만 사용 -> import 패키지이름.클래스이름;

import java.util.Scanner; //java.util 패키지의 Scanner 클래스

 

=> import 문을 사용하면 다른 패키지에 속한 클래스를 사용할 때마다 클래스의 경로명을 입력하지 않아도 된다.

Scanner scanner=new Scanner(System.in);

 

※ 패키지를 사용하는 이유

· 클래스의 분류가 용이하다.

· 패키지가 다르다면 동일한 클래스 이름을 사용할 수 있다.

 

 

 

상속


상속(inheritance)

· 새로운 클래스가 기존 클래스의 필드와 메소드를 이용할 수 있게 하는 것

  - 기존 클래스: 부모 클래스, 상위 클래스, 기반 클래스

  - 상속받는 클래스: 자식 클래스, 하위 클래스, 파생 클래스

 

 

예시에서 부모 클래스 Person은 변수 2개와 메소드 3개를 가지고 있다.

상속을 통해 Person의 자식 클래스인 Student, Professor는 Person에 선언된 변수와 메소드를 사용할 수 있다.

 

=> 상속을 통해 클래스들의 계층 관계가 형성된다.

=> 자식 클래스는 부모 클래스에 선언된 필드나 메소드를 작성하지 않아도 사용할 수 있다.

 

 

PrintWriter 클래스의 설명서를 보면 아래와 같이 클래스 간 상속관계가 나타나 있다.

· PrintWriter 클래스: Writer 클래스를 상속받았다.

· Writer 클래스: Object 클래스를 상속받았다.

 

 

클래스 간 상속관계의 특성


이클립스에서 Open Type Hierarchy 이용해 클래스의 상속 관계를 확인할 수 있다.

클래스의 상속 관계

· PrintWriter: Writer를 확장해서 만든 클래스

· Write: Object를 확장해서 만든 클래스

-> PrintWriter 클래스는 Writer의 write 메소드와 Object의 toString 메소드를 사용할 수 있다.

 

· Object 클래스: 모든 클래스의 부모 -> 모든 클래스는 Object 클래스를 상속받는다.

· 메소드 오버라이딩(method overriding): 부모 클래스의 메소드를 자식 클래스에서 재정의하는 것

-> 부모 클래스의 메소드보다 자식 클래스의 메소드가 더 높은 우선순위

 

 

** 자바는 다중 상속을 지원하지 않는다.

 

자바 API 설명서에도 클래스들 간 계층적인 구조, 부모 클래스로부터 상속받은 변수와 메소드에 대한 설명이 나와있다.