[Java] 클래스, 인스턴스, 패키지, 상속
목차
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가 존재하는 클래스는 인스턴스를 생성할 수 있다.
출처
https://cerulean85.tistory.com/149
패키지
패키지(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 설명서에도 클래스들 간 계층적인 구조, 부모 클래스로부터 상속받은 변수와 메소드에 대한 설명이 나와있다.