댓글을 안 달 수가 없네요. 수년전 더 젊은 나이에 Java 를 유료 강의로 3개월이나 들었건만, 도무지 이해할 수 없었던 모든 개념들이 이고잉님의 강의 몇 편으로 완전히 개념이 잡혔습니다. 이제 자바 코드에서 뜻도 모르고 타이핑하며 따라했을 때 나왔던 모든 요소들이 하나하나 다 이해가 됩니다. 특히 인스턴스 개념은 압권입니다. 정말 감사합니다.
간단한 예를 들자면, 클래스는 추상적인 개념입니다. 예를 들어 우리가 자동차 혹은 개를 생각을 해본다면 머릿속에 그려지는 추상적인 개의 모습이 있을 거에요. 다리는 4개가 달려있고, 귀가 있고, 털이 있고 등등. 이 틀 혹은 공통적인 요소를 가지고 있는 뼈대 (개 클래스) 를 가지고 각각의 다른 개들을 찍어냈을 때에 얘네들을 인스턴스라고 합니다 ! 흔히들 클래스를 붕어빵 틀에 비유를 많이 하시는데요, '붕어빵' 이라는 같은 틀을 가지고 있지만 슈크림맛, 단팥빵, 재료등 다른 맛들을 찍어낼 수 있지요 !
파이썬의 class와 instance개념과 상당히 유사하네요...! 저도 코딩을 전공중인 학생인데, 파이썬과 연관 지어서 이해해보려고 노력중입니다. class라는 것을 여러분 너무 어렵게 생각하지마시고, 예를들어 int,float,string도 class입니다. method는 그안에 있는 내장함수에요. 예를들어서 string의 언어 중 한개를 바꾸고 싶은 replace함수. string은 클래스고, 그 아래 replace라는 메소드(함수)가 있는 메커니즘입니다 !
와~~~~~~!!!!!! 인스턴스 개념을 몰랐는데, 역시...egoing님 설명 들으니 딱! 이해 됐습니다. 왜! 인스턴스란 개념이 생겨났는가, 없었을 때는 어떤 고통이 있었는가! 이것을 상상하니 느낌이 딱 왔습니다. 감사합니다. 이제 다른 언어에서 new를 만나도 흐릿한 부분 없어 확실하게 사용할 수 있겠어요
이해를 돕자면 펭귄 클래스를 만듭니다. 뽀로로를 펭귄 클래스의 인스턴스로 생성합니다. 펭귄이 가져야 할 것들, 특성 들을 가지고 있습니다. 여기서 또 다른 펭귄인 뽀순이가 등장합니다.. 뽀순이도 펭귄이기에 펭귄의 특성들을 가지고 있죠. 뽀로로와 뽀순이는 다른 펭귄입니다. 하지만 둘 다 펭귄이죠. 클래스가 펭귄 같은 것이고 인스턴스가 뽀로로 같은 것입니다.
일회용이 아닌 긴 맥락의 클래스를 사용할 때는 constructor를 만들어 클래스를 복제한다. 이 복제된 값이 인스턴스고, 인스턴스의 데이터 타입을 정해주기 위해 앞에 클래스 이름을 붙인다. 이를 통해 다시 해당 파일의 내용을 수정하더라도 어느 파일의 내용을 수정할 건지 다 적을 필요가 없어 효율적으로 사용이 가능하다.
class가 하는 작업이 일회용이 아니면 class를 복제한 인스턴스를 만들어 사용할 수 있도록 사용자에게 제공, 그에 맞춰 코드 제작 constructor가 없는 Method는 일회용(e.g. Math) class가 하는 작업이 긴 맥락이라면 class를 복제한 인스턴스를 만들어서 사용자에게 제공하는 것이 효율적 constructor가 있는 Printwriter는 인스턴스를 만드는 것이 허용되어있음 PrintWriter(어떤 값이 올지 규제) p1 = (클래스를 인스턴스로 활용하길 원한다면 Constructer 활용됨 ->)new(new를 붙여 인스턴스) PrintWriter("result1.txt")
제가 이해한 인스턴스(Instance)라는 것은 특정한 클래스(Class)의 상태를 내장하고 있는 지정변수(Variable)입니다 즉, Instance는 클래스의 특정한 상태를 내포하고 있는 값이며 해당하는 값을 고정/변동하여 사용할 때 지정하는 이름과도 같다고 생각이 듭니다 감사합니다, 이고잉님.. ㅠ 국비학원에서 이해가 안되는 부분들을 여기서 다 채우고 있네요.. 저는 개념이 정리가 안되면 잘 이해를 못하는 타입인데 이 영상들로 이해가 전부 되어가고 있습니다 비전공자들 반드시 이고잉님 강의로 천천히 시작하시면 다 되리라 믿습니다.. 이고잉님 강의로 시작하면 너무 재밌고 쉬운 코딩이 되리라 믿어의심치 않습니다.. 감사합니다!!! ㅠㅠ
자 정리를 위해 댓글 적어봅니다. 예제에서 p1은 결국 PrintWriter("result1.txt")와 같습니다. 그 말은 p1.write("Hello 1")은 PrintWriter("result1.txt").write("Hello 1") 와 같다는 얘기입니다. 효율을 위해 새로운(new) PrintWriter를 만들고 변수에 담아 사용한다는 얘기 같네요.
반복되는 method가 반복된다면 하나의 클래스를 앞에 new를 붙여서 복제해서 각각의 다른 상태를 가지고 있는 인스턴스를 만들어서 이를 사용하는 것이 더 효율적이다 클래스가 하는 작업이 단순한 하나하나 하는 작업이라면 그냥 그대로 사용 예를들면 math라는 class 클래스가 하는 작업이 긴 작업이라면 클래스를 복제한 인스터스를 만들어서 활용할 수 있게 제공하고 이를 이용한다. 이 경우 constructor(생성자)라는 것이 있다 예를들면 printwriter라는 class PrintWriter p1 = new PrintWriter("result1.txt"); 여기서 PrintWriter("result1.txt") 이게 construnt 여기에 앞에 new를 붙이면 복제되어서 p1이 instance가 되고 이 인스턴스에 어떤 값이 올수 있는지 규제하기 위해 앞에 printwriter라는 class의 이름을 적는것 어려운 내용이다 선생님도 이해하시는데 1년 걸림 눈치껏 하다보면 이해도 하기 전에 익숙해져서 사용하게된다
클래스란 관련된 변수와 메소드를 담고 있는 공간이고 이름이 있다. 클래스는 한번만 사용할 클래스가 있고 여러번 사용해야 할 클래스가 있다. 만약에 파이를 계산해서 프린트를 하고 싶다면 파이를 계산해야 하는 상황은 그 클래스의 내용이 여러번 반복되야 할 필요가 없다. 하지만 클래스의 내용이 계속 변화해야 한다면, 예를 들어 텍스트 파일 안에 쓰고 있는 글이 계속 변화한다면, 하나의 클래스의 같은 메소드를 여러번 반복 하여 쓰는것은 비효율 적이고 보기에도 힘들다. 그렇기 때문에 하나의 클래스를 복사하여 = instance 화 하여 변수에 집어 넣고 데이타 타입으로는 이게 클래스를 instance 화 한다는걸 자바에게 알려주기 위해 클래스이름을 붙여 주면. 그 클래스 안에 들어갈 메소드를 어느 클래스를 향하고 있는 건지 다시 말해 어떤 텍스트 파일을 향하고 있는 건지 자바에게 경로를 나눠 주게 되어.. 텍스트 파일 변경에 용이해진다.
눈치껏..? 듣고 정리하자면 , instance는 반복적으로 진행되는 것들을 효율적으로 만들어 줄 수 있고, instance로써 작용하는 class는 constructor을 갖는다. (눈치껏 들은 걸 대충 눈치껏 적어본다... 더 명료하고 자신감있게 얘기할 수 있는 그날까지 공부...고잉..)
1. 파일이 없을 때 exception 이 뜬다, 근데 계속 말씀하시는 텍스트 파일인가요? 저 클래스를 사용하면 테스트 파일이 만들어 지는데 왜 텍스트 파일이 없다고 나와요? 2. p1.close(); 클로즈 안해주면 다른 사람이 그 텍트트 파일 (result1) 을 변경 못하는 건가요?
import java.io.FileNotFoundException; import java.io.PrintWriter; public class instanceapp{ public static void main(String[] args) throws FileNotFoundException { PrintWriter p1 = new PrintWriter("result1.txt"); p1.write("hello 1"); p1.close(); PrintWriter p2 = new PrintWriter("result2.txt"); p2.write("hello 1"); p2.close(); } } Constructo , instance **컨스트락터가 있으면 클래스를 마음껏 복재할수있다 즉 인스턴스가능하단말, 쉽게말하면 클래스를 펑션화시키는거임. 예를들어 파이 같은 경우는 컨스트럭터가 없어서 인스턴스가 불가능하다. 무한사용이 불가능한말임. 일회용 클래스라는말임 instance는 펑션처럼 언제든지 필요할때 사용할 수 있다. 반복해야하는 코드는 instance으로 해서 사용하면 좋다. 일회성 코드는 구지instance할 필요가 없다. 반복 해야해 p1 = new 반복해야해 (( 반복하기 쉽다 p1.write(“”)하면끝)) p1.반복 System.out.println("반복안해도됨"); 예를들어 일회용 >>System.out.println(Math.PI); ((반복하려면매우길다 p1 하나로 안끝남)