[JAVA] 인스턴스(Instance)

아임 레조·2022년 6월 24일
0

JAVA

목록 보기
12/21
post-thumbnail

InstanceApp이라는 프로젝트를 만들고 주석에 적힌 내용 순서대로 코드를 작성해준다.

이전에 Math 클래스를 이용해서 코드를 작성했던 것을 기억해보면 PrintWriter도 코드 작성을 저렇게 해주면 이상이 없어야 한다. 그런데 빨간 줄이 생긴다. PrintWriter는 자바에 내장되어 있기는 한데 특별한 작업, 즉 패키지를 가져오는(import) 작업이 필요하기 때문이다.

공식문서에서 PrintWriter를 찾아보면 PrintWriter는 java.io라는 패키지에 들어있음을 확인할 수 있다. 해당 패키지를 import를 해준다. 이 파일 내에서 PrintWriter라는 이름의 클래스는 java.io에 소속되어 있다는 의미를 갖는다. 근데! import를 해줘도 빨간 줄이 남아있다.

파일을 읽다보면 파일이 없다보면 문제가 될 수 있다 즉, 예외상황(exception)이 발생했을 때 그것을 어떻게 처리할지에 대해 정해주지 않았기 때문이다. 여기서 예외상황은 파일을 읽어내려가며 코드를 실행하는 와중에 파일이 없을 경우 생길 수 있는 문제 등을 의미할 수 있다. 일단 예외상황 처리에 대해서는 이해하기 너무 어렵기 때문에 엑스표시를 클릭하고 권장사항 중 하나로 나오는 add throws declaration을 선택해준다.

남은 코드 작성을 마치고 저장과 실행버튼을 눌러주면 프로젝트 폴더에 result1.txt와 result2.txt파일이 생긴다.

그리고 각 파일을 클릭해서 들어가면 원했던 것처럼 hello1과 hello2라는 텍스트가 잘 들어가있다.

이제 이전에 사용했던 Math 클래스와 PrintWriter 클래스의 차이를 살펴보자. Math의 경우 그냥 클래스 Math에 변수(PI)와 메소드(floor, ceil)를 써줬다. 그런데 PrintWriter는 변수와 메소드를 바로 쓰지 않고 new를 붙여줬다. 그리고 그 복제한 결과를 p1과 p2에 담았다. 왜 이렇게 해야할까?

만약을 생각해보면 왜 인스턴스가 필요한지 알 수 있다. PrintWriter가 바로 Write라는 메소드를 붙여 사용할 수 있다면? 실제로는 동작하지 않지만 'PrintWriter.write("")라고 쓸 수 있다고 가정하면,

PrintWriter.write("result1.txt", "hello 1");

이렇게 코드를 작성할 수 있을 것이다. 그럼 result2부터 수십억개의 결과를 나오도록 해야 한다면? write를 할때마다 어떤 파일을 수정할지 하나하나 지정하고 있는데 이것은 상당히 비효율적이다. 하지만 인스턴스를 사용하게 되면, 예를 들어서 내가 result151.txt에 내용을 기록하고 싶은 경우

PrintWriter p151 = new PrintWriter("result151.txt");
p151.write("hello151");
p151.close(); 

만 해주면 작업이 끝난다.

그런데 클래스에 직접 write를 하는 방식은 어떤 파일을 수정하고 싶을 때마다 상태를 그때그때 이야기해주어야 하는 귀찮음이 생긴다. 이유는 PrintWriter라는 하나의 클래스를 write라는 메소드가 돌려쓰고 있기 때문이다.

하지만 new를 통해서 인스턴스를 생성해주는 순간! 그 인스턴스는 내부적으로 각자의 상태를 가지게 된다. 즉, p1은 result1.txt를 p2는 result2.txt라는 내부적인 상태를 내장하게 되기 때문에 p1.write를 하게 되면 그건 result1에 관한 것이 되고 p2.write는 result2에 관한 것을 담당하게 된다.

Math는 일회적인 작업을 하지만 PrintWriter는 여러 개의 파일을(긴 맥락의) 작업하게 될 수도 있는 연속성을 가진다. 이럴 경우 하나의 클래스를 사용하기 보다는 new를 붙여 각각의 다른 상태를 가지고 있는 인스턴스를 만들어서 그 인스턴스를 사용하는 것이 더 효율적일 수 있다.

그럼 어떤 클래스는 인스턴스를 만드는게 좋은지 알 수 있는 방법이 있을까? 공식 문서에 가서 constructor Summary가 있는 경우 인스턴스를 만드는 게 허용된다고 우선은 간단하게 생각해두자.

실제로 공식문서에 들어가서 확인해보면 Math에는 constructor에 관한 내용이 없는데 PrintWriter에는 constructor에 관한 내용이 있다. 이번에 사용한 건 네모박스 쳐둔 것이고 해당 내용을 클릭하면 detail한 내용이 나온다.

정리해보면,

우리가 어떤 클래스를 사용할 때 그 클래스를 만든 사람이 클래스를 인스턴스로 활용하기를 원한다면 constructor라는 것을 가지고 있고 노란박스로 처리한 부분이 constructor가 된다. 그 constructor앞에 new를 붙이면 그게 복제되서(연두색 박스) 인스턴스가 되고 그 인스턴스에 어떤 값이 올수 있느냐를 규제하기 위해서 앞에 PrintWriter라고 하는 클래스 이름(보라색 박스)을 적는다.

profile
어쩌다보니 백엔드 개발자/ 번아웃 없이 재밌게 개발하고 싶어요

0개의 댓글