저희 전 시간에 우리가 클래스가 무엇인가 라는 것 살펴봤어요. 클래스는 서로 연관된 변수와 메소드를 모아서 이름을 붙인 것 이라는 겁니다. 자 그럼 이제 이번 시간에 살펴볼 것은 인스턴스 라고 하는 대단히 중요한 하지만 너무나 어렵기 때문에 처음 듣고 이해하는게 이상한. 여러분은 마음에 편하게 구경하시면 되는 그런 주제를 좀 살펴보도록 하겠습니다. InstanceApp.java 라고 하는 파일을 만들었구요. 여기서 실습을 진행을 해 나가도록 하겠습니다.
제가 하고 싶은 일을 먼저 설명드리겠습니다. 저는 result.txt 파일에 다가 Hello 1이라고 하는 텍스트를 자바를 이용해서 작성을 해 볼 겁니다. 자 그러기 위해서는 여러분이 검색도 질문 이런 것들을 통해서 어떤 클래스가 필요한지를 알아내시고 그 클래스를 사용하는 예제와 같은 것들을 찾아 내신 다음에 그래도 이해가 안가는 것들이 있을 때 api documentation을 분석해서 오랜 시간에 걸쳐서 그 사용법을 알아 내셔야 됩니다.
자 그럼 알았다고 치고 우리 한번 코딩을 해 볼까요. 자 여러가지 방법이 있습니다만 PrintWriter 라고 하는 클래스를 좀 이용할 겁니다. 근데 이 클래스는 Math와는 생긴게 상당히 달라요. 생긴게 다르다기보다는 사용법이 상당히 다릅니다. Math는 그냥 이렇게 하면 끝나는데 얘는 뒤에다가 괄호를 붙여서 제가 저장하고 싶은 파일의 이름을 적습니다. 요렇게요. 그리고 그 앞에다가 new를 붙여서 제가 하고 싶은 것은 PrintWriter의 복제본 다른 말은 아바타 같은 것을 만들고 싶은 거예요. 자 그리고 그 복제본을 저는 p1이라는 변수에 담았습니다. 그러면 저 변수에 담겨있는 어떠한 무엇을 뭐라고 하냐면 PrintWriter라는 클래스의 인스턴스인 거에요. 자 그리고 요 p1에는 아무거나 들어가면 안되기 때문에 p1 에는 반드시 PrintWriter라는 클래스의 인스턴스만 들어간다는 뜻에서 데이터 타입으로 PrintWriter를 지정을 해 줬습니다.
public class InstanceApp {
public static void main(String[] args) {
PrintWriter p1 = new PrintWriter("result.txt")
}
}
자한테 이렇게 하는데 빨간색 밑줄 쫙 가있단 말이에요. 빨간색 밑줄 문제가 있다는 뜻이거든요. 왜 그러냐면 여기있는 Math의 경우에는 여러분이 특별한 조치를 하지 않아도 사용할 수 있는 해요. 그런데 PrintWriter는 자바에 내장되어 있긴 한데 어떤 특별한 작업을 해야 됩니다. 그게 뭐냐면 패키지를 가져오는 작업을 하셔야 돼요 자 그게 뭐냐.
import java.io.PrintWriter;
Import는 가져온다는 뜻이거든요. 제가 필요한 PrintWriter는 java.io라고 하는 패키지에 소속되어 있습니다. 그리고 제가 여기다가 PrintWriter라고 하게 되면 이 파일 내에서 PrintWriter라는 이름의 클래스 는 java.io 에 소속되어 있는 것이다 라는 것을 나타낸 코드가 이것입니다.
import java.io.PrintWriter;
public class InstanceApp {
public static void main(String[] args) {
PrintWriter p1 = new PrintWriter("result.txt")
}
}
자 그래도 빨간색 줄이 있죠. 자 저건 왜 그러냐면 우리가 파일을 읽다 보면은 예를 들면 파일이 없으면 문제가 될 수 있잖아요. 바로 그러한 경우를 예외 상황 이라고 자바에서 얘기하는데, 그런 예외를 어떻게 처리할 지에 대해서 우리가 정해야 되는데 얘는 지금 우리가 하긴 너무 어렵습니다.
그래서 여러분 항상 예외가 뭔지 알기 전까지는 여러분 심각한 소프트웨어를 만들기 전까지는 Add throws declaration 이라고 하는 저것에 클릭하시면 하겠습니다. 자 여기서 IO로 선택을 하시면 되구요.
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();
}
}
그럼 저는 저 p1 이란 인스턴스에서 write를 해서 Hello 1이라고 요렇게 하고요. 그리고 p1 에 대한 작업을 다 끝냈으면 클로즈 를 통해서 저 파일을 더 이상 붙잡고 있지 않도록 해서 남도 수정할 수 있도록 한 겁니다. 그러면 이거 그대로 카피해서 이번에는 result2의 p2 라고 하는 변수 그리고 Hello 2 라고 하는 내용을 이렇게 담았습니다.
자 그리고 제가 실행을 시키면 여기에 우리의 프로젝트 폴더에 어떤 일이 생기는지 살펴보죠 123. 자 실행을 시켰구요 그리고 리프레쉬를 한번 해보셔야 될 겁니다
여러 보시는 것처럼 result1이 생겼고 result2가 생겼습니다.
자 그럼 다시 원점으로 돌아와서 우리 수업의 중심 주제인 인스턴스가 뭐냐. 라는 얘기를 좀 해 보자구요. 여기 밑에 있는 클래스는 그냥 클래스 에다가 변수 이름을 썼거든요. 또 클래스 에다가 메소드를 썼구요.
PrintWriter p1 = new PrintWriter("result1.txt");
p1.write("Hello 1");
p1.close();
근데 PrintWriter 는 그냥 쓰지 않고 new를 붙였다는 말이에요. 그리고 그것을 복제한 결과를 p1에 담았다라는 차이점이 있습니다. 왜 이렇게 굳이 하는지를 한번 살펴볼까요. 여기 동작하는 코드는 제가 주석 처리를 해서 작동을 하지 않도록 일단 해놨습니다. 자 그리고 만약에 인스턴스 를 쓰지 않는다면 어떤 불편함이 있는가를 보시면 조금 더 이해하는데 도움이 되겠죠.
자 PrintWriter라는 클래스가 있다고 쳐요. 실제로 있죠. 그리고 PrintWriter 라고 요렇게 칠 수 있다고 쳐봅시다. 이건 실제로 동작하지 않는 코드예요. 그럼 우리가 어디에 내용을 저장할 지 무엇을 저장할지를 정해야겠죠. Write의 첫 번째 입력 값으로 이렇게 하고요 두번째 입력 값으로 헬로원 이렇게 했을 때 이 코드가 여기 있는 요 만큼의 코드와 똑같은 역할을 한다고 믿어 주세요. 예 상상해 주세요. 실제로 그렇지 않지만요. 자 그리고 이번에는 resort 2.txt Hello 2 라고 하는 내용을 저장을 한다. 그리고 이러한 작업이 이렇게 일회성으로 있는 것이 아니라 엄청나게 많이 이루어진다 고 한다면 우리 눈에 엄청나게 거슬리는 것이 있습니다.
어때요 여기 Write를 할 때마다 내가 어떤 파일을 수정 할지를 이렇게 지정하고 있죠. 이것은 상당히 비효율적인 느낌이 들어요. 예를 들어서 우리가 인스턴스 라는 걸 사용했을 때를 보면 만약에 여러분이 result1.txt의 대화 내용을 기록하고 싶다. 그럼 그냥 p1.write("Hello 1"); 이렇게 해주시면 된단 말이죠. 그런데 여기 있는 이 클래스 에다가 직접 Write하는 방식은 어때요. Write를 할 때마다 내가 어떤 파일을 수정할 지에 대한 상태를 그때 그때 얘기해 줘야 된다는 것이죠. 그 이유는 뭔가요. 여기는 PrintWriter 는 PrintWriter 라고 하는 하나의 클래스를 Write가 서로 돌려막기하고 있단 말이에요. 돌려 쓰고 있단 말이죠. 자 그런데 여기 있는 PrintWriter 는 new를 통해서 인스턴스 를 만들었고 그 인스턴스는 내부적으로 각자의 상태를 가지고 있습니다. 여기서의 상태는 p1은 result1.txt p2 는 result2.txt라는 내부적인 상태 를 내장하고 있기 때문에 p1.write를 하게 되면 그건 누구에요. result1에 대한 거에요. p2.write는 result2 에 대한 것이라는 겁니다. 자 그래서 여기 있는 이 Math의 경우에는 이거는 일회용같은 작업들이에요. 3.14 가 필요하다 그리고 1.6을 1.0 으로 바꾼다. 즉 아주 짧은 맥락에 작업들이 란 말이죠. 일회용이에요 일회용.
자 그런데 우리가 어떤 파일을 수정한다 라는 것은 그 파일 하나만 수정하는 것이 아니라 그 파일에 대한 여러가지 작업들이 후속으로 쭈루룩 들어오게 되고 그리고 동시에 여러 개의 파일을 작업하게 되어야 될 수도 있단 말이죠. 그런 경우에는 이렇게 하나의 클래스를 사용하는 것보다는 하나의 클래스를 앞에 new 를 붙여서 복제해서 각각의 다른 상태를 가지고 있는 인스턴스를 만들어서 걔를 사용하는 것이 더 효율적일 수 있다라는 겁니다.
그래서 클래스를 만드는 사람들은 그 클래스가 그냥 인스턴스가 필요없이 일회용으로 쓸 수 있다~ 그럼 이런식으로 만드는 거예요. 그런데 그 클래스가 하는 작업이 일회용이 아니라 되게 긴 맥락의 작업을 꼬리에 꼬리를 누르면서 해야된다 그럴 때는 클래스를 복제한 인스턴스를 만들어서 그것을 사용할 수 있도록 사용자에게 제공하는 것이 더 효율적이기 때문에 그의 맞춰서 코드를 제작하게 됩니다.
자 그럼 Math 와 PrintWriter는 어떤 차이가 있는가를 좀 매뉴얼을 살펴보면은.. PrintWriter는 Constructor 라고 하는 것이 있습니다. 생성자라고 부르는 것이구요. Math는 찾아보시면 컨스트럭터 가 없어요. 즉 컨스트럭터 가 없는 애들은 일회용 이라고 일단 생각하세요. 요런 Math 같은거 또 시스템 도 마찬가지. 자 그런데 이제 PrintWriter 같은 경우는 컨스트럭터 가 이렇게 있습니다. 그러면 컨스트럭터 가 있다는 것은 저 컨스트럭터 를 이용해서 인스턴스 를 만드는 것이 허용되어 있다 라고 생각하시면 됩니다. 그럼 여기 여러가지 컨스트럭터 들이 있는데 그중에서 제가 사용했던
컨스트럭터 는 이해해요. 즉 PrintWriter 괄호 열고 그 안에다 result.1.txt라는 문자열을 줬잖아요. 여기 문자열이 잖아요 그래서 이 컨스트럭터를 사용한 것이고. 컨스트럭터는 어떻게 쓰는지는 클릭해 보면 나옵니다. 여기에 보면 설명이 있구요 이 컨스트럭터 에 입력 값으로 들어오는 값은 어떤게 들어와야 되는 지에 대한 설명이 있고 그리고 저 클래스를 사용하는 과정에서 생길 수 있는 오류는 어떤 것인지 예를 들면 이 애 같은 경우는 파일을 찾을 수 없을 때 생기는 예외가 발생할 수 있다라는 것을 우리에게 알려 주는 것입니다.
자 그러면 정리해 볼까요. 작동하지 않는 코드는 이렇게 주석 처리를 해놓구요. 요것도 지워 버리겠습니다. 여러분이 어떤 클래스를 사용할 때 그 클래스를 사용한 만든 사람이 그 클래스를 인스턴스로써 활용하기를 원한다면 컨스트럭터라는 것을 가지고 있구요. 우리가 이렇게 new뒤에 붙인 얘가 컨스트럭터인거에요.
PrintWriter p1 = new PrintWriter("result1.txt");
p1.write("Hello 1");
p1.close();
그 컨스트럭터 앞에 new를 붙이면 걔가 복제 돼서 인스턴스가 되고 그 인스턴스에 어떤 값이 올 수 있느냐를 규제하기 위해서 앞에다가 프린트 라이터 라고 하는 클래스 이름을 적는다 라는 것이에요.
그래서 이거 이제 우리 처음 자바 입문 하시는 분들 같은 너무너무 어려운 일이고 저는 이거 이해하는 데 1년 걸렸어요. 그러니까 여러분들이 너무 이해하려고 노력하지 마시고 눈치껏 하시면 됩니다 아 남 들이지 않고도 보면서 눈치껏 바꿔가면서 하다 보면 어느 순간에
얘도 하기 전에 익숙해져서 사용할 수 있게 될 겁니다.
------
* 유튜브 강의에서 자막을 추출해 정리했습니다.
-----
* 클래스: 는 서로 연관된 변수와 메소드를 모아서 이름을 붙인 것
* 클래스에는 일회용이 있고, 긴 호흡을 갖고 작업할 수 있게 하는 클래스가 있다.
* PrintWriter 는 new를 통해서 인스턴스를 만들었고 그 인스턴스는 내부적으로 각자의 상태를 가지고 있다.
* 인스턴스를 쓰는 이유: 하나의 클래스를 앞에 new 를 붙여서 복제해서 각각의 다른 상태를 가지고 있는 인스턴스를 만들어서 걔를 사용하는 것이 더 효율적일 수 있기 때문에.
* 인스턴스를 만들 수 있는 클래스들은 constructor; 생성자를 갖고있다.
* 핵심: 그 constructor 앞에 new를 붙이면 걔가 복제 돼서 인스턴스가 되고 그 인스턴스에 어떤 값이 올 수 있느냐를 규제하기 위해서 앞에다가 PrintWriter라고 하는 클래스 이름을 적는다..
'생활코딩 > JAVA1' 카테고리의 다른 글
생활코딩) JAVA1 - 14.1. 나의 앱 만들기 - 오리엔테이션 (0) | 2021.05.12 |
---|---|
생활코딩) JAVA1 - 13.5. 자바 문서 보는 법 - 상속 (0) | 2021.05.12 |
생활코딩) JAVA1 - 13.3. 자바 문서 보는 법 - 클래스 (0) | 2021.05.10 |
생활코딩) JAVA1 - 13.2. 자바 문서 보는 법 - 패키지,클래스,변수,메소드 (0) | 2021.05.10 |
생활코딩) JAVA1 - 13.1. 자바 문서 보는 법 - API vs UI (0) | 2021.05.10 |