좋은 영상 감사드립니다. 2023년도 고생 많으셨습니다. 제 의견을 하나 덧붙여도 될까요? class, object, instance는 모두 미국에서 만들어진 영어 표현입니다. 영어와 한국어는 서로 다른 언어이며, 서로 다른 문화 및 세계관에 기반하고 있습니다. 따라서 일반적으로 1:1 매칭은 어렵지 않겠습니까? 영어를 무리하게 한국어로 설명하려고 (혹은 한 단어로 간단히 번역하려고) 하다보니 발생하는 문제점도 있는듯 합니다. 제가 권유하고 싶은것은 다양한 영문 학술 서적, 혹은 논문 (컴퓨터 과학 이외에도) 을 읽는 것입니다. 그러면 어느새 자연스럽게 영어식 세계관에 익숙해지면서 본건과 같은 어려움은 줄어들것이라 생각합니다. 굳이 한국어로 번역하자면.. class : 무엇인가의 모임 (수학에 관심 있으신 분들은 set vs class참고) (클래스에 변수든, 메소드든 모아 놓죠? 따라서 프로그래밍의 맥락에서는 설계도로 해석 가능) instance : 구체적 예시, 혹은 구체적으로 실현된것 (class를 구체적으로 실현하려면 메모리에 올려야겠죠? 따라서 어떤 변수를 선언하여 메모리에 올린다는것은, 어떤 인스턴스를 만드는 행위로 해석 가능) object : 독립적, 영속적으로 존재하는 무언가를 지칭하는, 포괄적인 일반 명사 (컵, 책, 인간, 법인 등등) (클래스는 하나의 독립된 단위, 혹은 부품으로서 상속 등과 관계없이 영속적으로 존재하죠? 따라서 오브젝트의 일부로 볼 수 있습니다.) 단어의 의미에 관해서 깊이 파고 들어가면, 위의 설명들에 대한 반례 혹은 철학적 고찰도 가능하겠습니다. 그러한 고찰은 바람직한 것입니다만, (저도 반례들에 대해서 생각해보았습니다.) 일단 CS관점에서는 일반적인 용례로 충분하다고 생각합니다. 이 세상의 모든 언어가 완벽하게 논리적이지는 않지요.
영상으로 쉽게 설명해주시다니 너무감사드립니다. 올해 마무리 잘하시고 새해복 많이 받으시기 바랍니다 요즘도 대학 교수님들 뿐만 아니라 출판되는 책에서도 클래스 붕어빵틀 객체 붕어빵 이렇게 설명하고 있네요 또 상상속 붕어빵 이건 제가 네이버 지식인에서 주워들은 겁니다. 속 시원히 설명해 주셔서 감사합니다.
클래스는 객체라고 하는 추상적인 개념을 표현하는 설계도라고 생각합니다. 인스턴스는 그런 클래스가 메모리에 올라간 클래스의 실체라고 생각하구요. 객체는 인스턴스가 객체지향에서 사용되며 인스턴스가 단일 혹은 여러 인스턴스가 모여 이루는 하나의 "책임" 이라는 것에 의해 정의되는 개념이라고 보았는데 제가 이해한 바가 맞다면 위의 생각을 바꾸지 않아도 되겠군요.
Object는 어딘가 위치해야 되는 목적을 갖는 운명체입니다. 따라서 이것이 목적한 바에 따라서, 현존하는 분류체계 상의 정의인 Class로 기술되고 실체적으로 동작하기 위해서 Instance를 통해 관계를 만들어가고 그러한 것들이 모여서 누군가에게는 서비스라는 집합체로 존재한다고 봅니다.
1:20 에서 클래스:객체==상상속붕어빵:붕어빵 이야기가 나오는데, 어느정도 이 부분이 서양 관점에서는 오히려 더 맞는 이야기입니다. 서양 철학은 널널한개발자님을 보고 단순히 개발자님을 생각하는 것이 아니라, 인간이라는 존재를 한번더 생각하라고 합니다. 그리고 유럽에선 이러한 사고방식이 당연합니다. 그래서 OOP는 어찌보면 이런 당연한 서양적 사고방식대로 프로그래밍을 해보자는 운동에서 나온 것이지요. 한국에서 코딩을 처음 배울때 OOP는 쉽지 않습니다. 한국에선 서양적 사고방식이 당연한 것이 아니기 때문이죠. 다시 처음으로 돌아오면, 서양 사회에서 상상속의 붕어빵은 클래스이고 실제 붕어빵은 객체가 당연한 비유라고 볼 수 있습니다. 아마 이런 이야기를 하신 분은 유럽이나 미국에서 오래 사시다 오신 분이 아닐까 싶네요.
그리고 이 다음은 제 개인적인 생각인데요, OOP를 가르칠때 사용하는 비유는 처음 OOP를 배우는 한국인들에게 더 어려움만 가중시킨다고 생각합니다. 서양사람들에겐 지극히 당연하고 쉬운 내용이지만요. 이런 교육방식을 보면, 영어 회화에 큰 도움이 되지 않는 일본식 영어 문법이 떠오르는 듯합니다. 그래서 한국에서 OOP를 가르칠 땐, 협업/코드재활용/SOLID원칙 등을 바탕으로 설명을 해야한다고 생각합니다.
저의 작은 식견으로 모든 프로그래밍 언어에서 같은 개념 또는 비슷한 개념을 서로 달리 호칭하고 정의해서 다른 프로그래밍 언어를 배우려는 분들에게 항상 혼란을 야기합니다.. 제작자의 의도가 담긴 일종의 자기 과시 같은 것이죠.. 내가 이런 언어를 만들었고, 통상적으로 다른 언어에서는 이런 개념과 기능을 xxx 라고 하는 것을 나는 다른 이름으로 정의할테니 너희들은 그런줄 알아.. 라는 식으로.. 자기가 만든 언어에서 다른 언어의 작동 기능과 같은 내용을 똑같은 단어로 표현하면, 마치 내가 베낀 것 같고, 그래서 자존심 상하니까 다른 단어로 정의해 놓으니 말입니다.. 물론 제작자가 꼭 그런 의도로 단어를 정의했다고 할 수도 없습니다.. C++ 을 만드신 비야네 스트롭스트룹 조차도 자신이 만든 언어를 객체지향 언어(OOP) 또는 멀티패러다임 언어라고 생각하거나 말한적 없고, 정작 본인은 단지 가벼운 추상화 언어(?) 정도로 생각한다고 합니다.. 오히려 다른 사람들이 이러쿵 저러쿵 제작자의 의도와는 다른 추상화네.. 캡슐화네.. 상속성이네... 다형성이네.. 라는 표현과 정의를 해서 여러 사람들을 혼란스럽고 불편하게 하는 것이죠... 클래스 역시 구조체에서 확장된 개념으로 구조체와 생김새와 문법이 거의 동일합니다.. C++이 처음 등장할 때만 해도 C++이 아니였고, C with Classes 였습니다.. 단지, 크게 다른 점이 private, public 이란 개념이 들어가 있고, 구조체에는 없는 method 라는 것을 같이 버무려 놓은 것이 class 인데, 이 method 역시 함수와 같은 의미 입니다.. 그래서 결론은, 객체이네.. 아니네.. 붕어빵이네... 붕어빵 만드는 틀이네.. 하는 말 너무 신경 안쓰고, 그냥 objec는 오브젝트이고, class는 구조체인데 좀 확장된 개념이고, 그래서 자료형이고, instance는 호성님 말씀대로 그냥 변수 정도로 생각하는게 좋습니다.. 저 또한 그렇게 생각하는데 큰 무리 없었습니다.. 모든 프로그래밍 언어는 C에서 파생된 만큼 그 개념은 서로 서로 거의 비슷합니다.. 그러므로, 너무 단어 하나하나에 꼬치꼬치 깊이 파고 들어가지 마시고, C 언어를 기준으로 아.. 이런 개념이구나.. 정도가 좋을 듯 싶습니다...
다른분들이 여러 댓글로 설명을 해주셔서 길게 적지는 않겠지만 쉽게말해 객체 = 현실의 붕어빵, 클래스 = 가상세계에서 붕어빵을 만들기 위한 붕어빵 틀, 인스턴스 = 가상세계에서 구현한 붕어빵 라고 보시면 됩니다. 객체(구체적인 사물이든 추상적인 개념이든)의 기능과 속성을 분석하여 그 내용들을 클래스라는 코드로 작성하고 그 클래스를 기반으로 메모리에 실질적으로 구현화(인스턴스화)하여 작성하는 개발 기법을 객체지향이라고 생각하시면 됩니다.
응!? 이해했어 ㅋ 객체(object, 컴퓨터 용어에 한해서) - 실체의 유무를 떠나서 우리가 사는 세상의 “하나의 대상”을 가리킴. 클래스(컴퓨터용어에 한해서) - 그 대상(객체)을 코드(컴퓨터 명령어)로 표현한 것 인스턴스(컴퓨터용어에 한해서) - 클래스(코드)가 CPU에 읽어 들어져 메모리상에 이름을 가진 형태로 존재. (익명 클래스라고 이름 없는 것도 있음..) 사람은 우리와 똑 같은 세상을 만들려고 하는 욕구?가 있음. 요즘 AI가 대세인데, 언제가 가상 현실도 만들겠죠? 혹자는 우리가 사는 세상도 가상 현실이라고도 한던데… 우리가 가상현실을 만들면, 가상에 가상에 가상에… 사람(객체)이 DNA(클래스)에 의해서 만들져(태어나다,create,생성자) 대한민국(메모리영역)에 김철수(인스턴스, ‘김’상위 클래스를 나타냄, 족보, 클래스 상속표)라는 이름을 가지고 살아가다(행동,메서드,성격 특징 등) 죽었다(소멸,destroy).
잘듣고있습니다. 자바쪽은 어느정도 일관된 용어와 정의가 있습니다. 기존의 c++베이스의 사고에서 자바를 해석하는건 개인적으로는 빠르게 학습할수있는 방법이지만 널널한개발자님의 경험을 배경이 되어 쌓아 올린 이해를 바탕으로한 지식으로 설명을하면 혹여나 이제 처음 배우는 학생들이 헷갈리지 않을까하는 생각이 들어서 댓글을 달게되었습니다.
안녕하세요 선생님. 인프런에 올려주신 ‘면접 전에 알고 가면 좋을 것들 - java 백엔드 개발자편‘ 강의를 아주 유익하게 잘 들어서 인사차 들렸습니다. 더불어 저는 1년이 채 안된 신입 자바/스프링 개발자인데, 선생님의 어떤 강의를 추가적으로 들으면 될까요? 비전공자인터라, cs 지식이 많이 부족합니다..
넓고 얕게 외워서 전공자 되기 + 네트워크 기초/응용 강의를 꼭 들으실 것을 권합니다. 비전공자로 시작하는 것이 크게 어려운 것은 아닐 수 있으나 3~4년차를 넘어가는 과정에서 CS이론에 대한 갈증이 커집니다. 각종 IT 인프라에 대한 이야기를 알아야 하기 때문입니다. 참고하시기 바랍니다. :)
널널한개발자님 저를 위해서 영상까지 찍어주셨는데 계속 비슷한 질문 하는거 먼저 사과의말씀 드리겟습니다. 2가지만 부탁드리겟습니다. 1. 영상에서 객체가 추상적인 개념이고 미인의 클래스로 아이유 한소희 등 찍어냈잖아요 그러면 붕어빵 비유로 하자면 객체는 내가 만들고자하는 즉 내 머릿속의 붕어빵이라고 생각해도 되나요? 즉 객체는 내 머릿속 붕어빵 클래스는 내가 생각하는 붕어빵을 기술하는 문법 인스턴스는 클레스에서 찍어나오는 붕어빵 제가 그렇게 생각한 이유는 저또한 찾아보면서 객체는 내가 생각하고있는대상 클래스는 객체를 기술하는 문법 인스턴스는 실체화 이렇게 기술한 블로그도 본적 있습니다. 여기 영상의 댓글에서도 "사람(객체)이 DNA(클래스)에 의해서 만들져(태어나다,create,생성자) 대한민국(메모리영역)에 김철수(인스턴스, ‘김’상위 클래스를 나타냄, 족보, 클래스 상속표)라는 이름을 가지고 살아가다(행동,메서드,성격 특징 등) 죽었다(소멸,destroy)." 이렇게 쓴사람이 있고 미인이라는 클래스에 아이유 한소희 찍어냈잖아요 영상에서 그럼 미인 클래스는 미인이라는 객체를 서술하는 문법이니까 객체는 내가 생각하는 추상적인 미인 일수도 있을거고 어느정도 일리있는 이야기인듯 해서 질문 드립니다. 저의 생각도 맞나요? 2. 객체지향에 대한 관점은 사람마다 다른가요? 제가 질문한듯이 객체에 대해서 여러가지 의견이 있었고 또 인스턴스는 물론이고 클래스 자체도 속성과 메서드가 있기때문에 객체라고 말하는 사람도 잇엇습니다. 그리고 심지어는 객체지향이 나오기전의 c언어의 구조체 조차도 객체라고 보는 사람도 있다고 하네요 속성이 있다는 이유만으로
1. 클래스는 붕어빵 굽는 틀, 붕어빵은 그 틀로 만든 인스턴스로 본다면 큰 문제는 없겠습니다. 너무 깊이 생각하지 않으셨으면 좋겠습니다. 그래봤자 프로그래밍 언어입니다. 인문학을 하자는 것이 아닙니다. 2. 네, 그런 면이 좀 있습니다. 추상적인 개념이라 더 그런 면이 있으며 생각보다 논쟁도 많고 심지어 종교적 다툼처럼 보일 때도 있습니다. 그러니 이 영상에서 언급한 수준 이상을 더 생각하지 말기 바랍니다. 경험이 쌓이면 자동으로 정리될 내용이기 때문입니다.
클래스나 객체나 같다고 보면 될거 같고 추상화 된것을 현실로 바꿔 사용하기 위해 서술한거라고 보면되고 어쨋든 코딩이 반복하고 많이 사용 하는걸 공장처럼 찍어내는거기때문에 클래스를 만들어서 찍어 낸게 인스턴스라고 보면 됨 복제품1(인스턴스) 복제품2(인스턴스) 같은 네이밍은 안되는것 굳이 클래스랑 객체를 구분짓는다 싶으면 객체가 붕어빵틀 인스턴스는 붕어빵 클래스는 좀 더 개발자적 시각? 구어체랑 문어체 구분하듯이 클래스는 문어체적인거라고할까.. 아닌가?