들어가기 전에
이번 시간에는 조금 생소한 개념인 인스턴스에 대해서 실습을 통해 알아보도록 합니다.
학습 목표
인스턴스에 대해서 알아봅니다.
핵심 단어
- 인스턴스(Instance)
강의 듣기
들어가기 전에
이번 시간에는 조금 생소한 개념인 인스턴스에 대해서 실습을 통해 알아보도록 합니다.
학습 목표
인스턴스에 대해서 알아봅니다.
핵심 단어
강의 듣기
인스턴스란
인스턴스는 클래스를 컴퓨터 상에서 실체화한 것입니다.
인스턴스는 왜 필요한 것일까요?
이번 시간에는 인스턴스에 대해 실습을 통해 알아보도록 합니다.
Programming 프로젝트에서 InstanceApp 클래스를 생성합니다.
InstanceApp.java
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();
}
}
Math 클래스와 달리 PrintWriter 객체는 new 키워드를 통해 인스턴스를 생성하여 사용합니다.
PrintWriter p1 = new PrintWriter("result1.txt");
result1.txt 파일에 쓰기가 가능한 PrintWriter 클래스를 실제로 생성해서 이름을 p1으로 붙였습니다.
PrintWriter 클래스는 java.io 패키지에 속해 있어서 사용하기 위해서는 import 구문을 이용해서 불러들여야 합니다.
PrintWriter 인스턴스를 생성할 때는 사용할 파일이 실제로 존재하지 않는다면 오류를 내기 때문에 이에 대한 처리를 해야 합니다.
Add throws declaration을 이용해서 에러 핸들링을 할 수 있습니다.
인스턴스를 만드는 이유
인스턴스를 만들지 않고
PrintWriter.write("파일 이름", "쓸 내용");
와 같은 식으로 구현하면 안되는 것일까요?
만약 여러 파일에 반복적으로 여러 내용을 쓰는 상황이라고 가정해 봅시다
.....
PrintWriter.write("result1.txt", "Hello 1");
PrintWriter.write("result2.txt", "Hello 2");
PrintWriter.write("result1.txt", "Hello 1");
PrintWriter.write("result2.txt", "Hello 2");
PrintWriter.write("result1.txt", "Hello 1");
PrintWriter.write("result2.txt", "Hello 2");
PrintWriter.write("result1.txt", "Hello 1");
PrintWriter.write("result2.txt", "Hello 2");
PrintWriter.write("result1.txt", "Hello 1");
PrintWriter.write("result2.txt", "Hello 2");
PrintWriter.write("result1.txt", "Hello 1");
PrintWriter.write("result2.txt", "Hello 2");
PrintWriter.write("result1.txt", "Hello 1");
PrintWriter.write("result2.txt", "Hello 2");
.....
(실제로 실행이 가능한 코드는 아닙니다.)
이런 경우 한번 파일에 쓰기 작업을 수행할 때마다 일일이 파일의 이름을 입력해 줘야 한다는 단점이 있습니다.
인스턴스는 객체를 다양한 상태에서 사용하고, 기능을 재사용할 경우가 많은 상황에서 유용한 방식입니다.
인스턴스를 생성할 수 있는 클래스는 자바 API Documentation에 Constructor Summary가 존재합니다.
생각해보기
1) 인스턴스와 클래스는 무슨 관계인가요?
참고자료
https://gmlwjd9405.github.io
https://docs.oracle.com
comment
Class는 문서입니다. 기능을 불러올때 어떤 기능을 해야하는지 정의하고, 데이터를 넣었을때 어떤 역할을 할지를 정의하는 문서입니다.
인스턴스는 클래스를 실체화하여 입출력 대기상태를 만들어 놓습니다. 단순하게 인풋 아웃풋이 1차원적으로 나오는 기능들만 묶인 클래스는 굳이 실체화할 필요 없습니다. 필요할때마다 클래스.메소드(매개변수) 하면 되니까요.
하지만 어디에 저장할지, 무엇을 저장할지. 그 저장한걸로 뭘 해야할지 등등 2차원적으로 여러번 접근해야될 경우 구체적으로 어떤녀석에 대입해야할지를 실체화해야합니다. 그런 기능을 구현해야할때는 인스턴스화가 필요하고, 인스턴스화한다고 가정하고 클래스에 기능들을 짜놓습니다.
클래스는 붕어빵틀이다. 붕어빵은 팥붕도 있고 슈붕도 있다. 팥붕과 슈붕 즉, 클래스로 만들어진 실제 객체가 인스턴스들이다.
이 인스턴스들은 Counstrutor(생성자)에 따라 속성값이 달라진다.
위의 예제에서 p1으로 result1의 이름으로 생성되고, p2로 result2로 생성됐듯이, 같은 PrintWriter 클래스를 사용했더라도 이렇게 각각 생성된 p1,p2를 인스턴스라고 하는 것이다.
1. 인스턴스는 클래스에 다양한 값을 넣을 때 편리하게 클래스 자체를 불러와서 쓸 수 있습니다.
인스턴스는 해당 클래스가 constructor 가 있는 경우고 변수에 할당해 해당 클래스의 복제품을 만들 수 있다.
클래스는 일회용으로 상용되는 메소드 , 변수의 모음이다.
오... 진짜 먼소린지 1도 모르겠다... ㅎ
클래스안에는 변수와 메소드가 있다.
인스턴스는 클래스에 있는 속성을 사용하는 복제품을 만드는 것이다.
단, 인스턴스를 사용하려면 클래스 안에 컨스트럭쳐가 있어야 된다.
그러나 클래스 중에 constructor가 없는 클래스(예:Math)는 인스턴스로 사용하지 못하는 클래스다. 즉, 인스턴스를 사용하려면 일단 해당 클래스에 constructor 있어야된다
클래스는 수학책(A)이고, 인스턴스는 수학책에 있는 지식을 가진 사람(변수(A))이다.
클래스에게 메모리를 할당하면 인스턴스, 클래스가 물이면 인스턴스는 화분?
클래스는 요리의 레시피, 인스턴스는 레시피대로 만든 음식과 비슷합니다.
어떤 클래스에 의해 소프트웨어 상에 구현된 구체적인 실체
의식의 흐름대로 가랑비에 젖어버리듯 공부해야겠다.
으악 어려워!
인스턴스와 클래스는 무슨 관계인가요?
클래스는 하나의 큰 틀이고 인스턴스는 해당하는 클래스의 특징을 갖는 객체이다. 클래스가 같은 인스턴스들은 공통점을 가지고, 생성자에 어떤 값을 넣느냐에 따라 인스턴스들 간의 차이점이 생긴다.
인스턴스는 클래스라는 기계에 접근해서 클래스 기계의 기능을 사용 할 수 있는 사람이라고 생각한다. 클래스에 정의 되어있는 변수 혹은 메소드를 new라는 것을 통해서 새로운 인스턴스를 생성한다. 이때 인스턴스의 활동범위를 제약하기 위해서 클래스이름을 변수유형에 적어준다. 그리고 생성된 새로운 인스턴스는 클래스라는 기계를 사용 할 수 있게 된다고 생각한다.
클래스를 만들때 그 목적이 일회성이라면 컨스트럭터 (생성자) 없이 설계되고
생성자 있이 설계된 클래스는 new class이름 (~~) 방식의 다양한 컨스트럭터 방식을 가진다.
컨스트럭터를 이용해서 해당 클래스의 인스턴스(실체, 예제)를 만들수 있다.
클래스는 기본 설계도와 같은 것이고, 인스턴스는 기본 설계도를 바탕으로 몇가지 추가된 결과물로 볼 수 있다.
신이 있다면 사람을 만들 때, 자바를 썼을지도 모른다.
사람에 대한 기본적인 클래스를 만들어놓고 각각의 사람에게 맞는 인스턴스를 만들어놓았을 것이다.
constructor를 클래스에 만들어 놓지 않았으면 모든 사람은 똑같았을테지만,
constructor가 있기 때문에 사람들은 각자 이름, 성격, 취미, 행동 등등을 가질 수 있게 되었으며, 살아가면서 자기 자신을 업데이트 할 수 있게 되었다.