오랜만에 새로 하는 느낌이라며 객체지향 프로그래밍 강의를 시작하셨다.
대뜸 개 이름이 만득이, 개 나이가 3살 출력해보란다.
프로그래밍 언어가 힘든 것은 인간의 언어와 완전 딴판이기 때문이다.
반복을 할라 해도 10번 반복 해줘~ 가 아닌 for 문에 i가 어쩌구 저쩌구 해야 된다.
우리야 이제 배웠으니 뭔 말인지 알겠지만 일반인드은 소스를 봐도 뭔 소린가 싶을 것이다.
아무튼 저게 개이름인지 뭔지 어떻게 아냐는 것이고 나중에 유지보수 하기가 힘들 것이다.
초장부터 하던 소리인데 지금은 알고리즘의 시대가 아니란다.
컴퓨터 성능이 워낙 좋아져서 우리가 여태 했던 그런 좋은 알고리즘을 통해 소스를 적는다 해도 0.00몇초 빨라질 뿐이란다.
그래서 현재는 알고리즘의 시대가 아닌 유지보수의 시대이고
절차지향 프로그래밍 (Procedural Programming) (순서대로 잘 짜서 프로그램 잘 실행 되게 하자.) 시대가 아닌
객체지향 프로그래밍(object Oriented Programming) (인간의 언어랑 맞추자, 실생활을 묘사하자)의 시대이다.
객체 : 실생할에 존재하는 것.
아무튼 지금의 목표는 '개'라는 객체를 만드는 것이고 그 객체라는 것을 만드려면 Class가 필요하다.
드디어 Class의 정체를 알게되었다.
먼저 class 명을 Dog로 정해서 만든다.
그리고 새로운 객체를 불러낼 때의 문법
클래스명 변수명 = new 클래스명();
개가 3마리 있다면 그 개들 마다의 속성이 있을 것이다. 누구 이름은 뽀삐, 품종은 푸들 누구 이름은 쫑이 이런식으로 말이다. 그런 속성들을 calss에서 변수를 이용하여 표현한다.
이렇게 작성하면 변수명이 전과는 다르게 파란색으로 표현 되는데 이를 멤버변수라고 하며 객체가 가진 속성을 나타낸다고 한다. 또한 따로 초기화를 하지 않더라도 기본값이 있다. 오히려 값을 넣으면 안 된다고 하셨다.
이렇게 해놓으면 회사 가서 개털린단다.
아무튼 이렇게 객체 속성에 값을 넣어 줄 수 있다. (변수명.XXX)
그리고 개는 실생활에서 밥먹고 똥싸고 등등 액션을 취할텐데 그것들을 멤버함수를 써서 표현한다.
위와 같이 함수를 불러올 때는 d.bark();를 써준다.
어쨌든 멤버함수 : 프로그램에 필요한 기능.
이해가 편하라고 멤버함수라고 하긴 했는데 공식적으로 그런 말은 없고 method라고 불린단다.
우리가 여지껏 만들었던 모든 함수들도 사실 다 method 였다.
클래스 속의 함수는 method라고 부르고 밖의 함수는 함수라고 부른다. 근데 Java에는 클래스 밖에 뭔가를 쓸 수가 없기 때문에 Java에는 함수라는게 없다. 원래 Java에선 함수라는 말을 쓰면 안 되는데 지금 까지 함수라고 부를 때 마다 어색해 죽을 것 같았단다. (Python은 함수가 존재함.)
Java - 완벽한 객체지향만을 보고 만들어진 프로그램.
Python - 섞여있는 언어.
컴퓨터를 하나 만들어보라 하셨다.
cpu : i7-1234
ram : 16GB
hdd : 500GB
정보출력
정리하자면
member variable, attribute, field : 멤버변수가 이런식으로 불리며 객체의 속성이다.
이것들은 자동 초기화가 된다.(기본형은 0, 참조형은 null)
method : 객체의 행동, 프로그램상 필요한 기능이다.
그리고 자동완성 기능이 잘 되려면 뭐 하나 만들었으면 저장을 항상 하라 하셨다.
더하기 하는 계산기 만들기
10+20
30+40 합 출력하기.
우리가 method 괄호안에 넣던 값인 parameter는 그 행동을 할 때 필요한 재료이다.
method 속에서 만든 변수 int hab 은 loval variable(지역변수)이며 그 행동을 하는 동안만 임시로 쓰고 버리는 것이다.
새로운 main을 가지고 싶음 - 객체랑 상관 없는데 perfect OOL 이라서 클래스를 새로 파야된다.
그래서 calss = 객체찍는 틀, object / instance = 틀로 찍어낸 객체
같은 값을 가진 여러개의 객체를 만들 때 object2 = object를 넣어 같은 값을 넣어줄 수 있다.
그리고 밑에서 object의 값을 바꾸면 object2의 값 역시 바뀐다.
main에 객체를 만들고 값을 넣으면 stack 영역에 객체가 생기고 그 객체의 값은 heap영역의 번지로 저장된다.
그런데 object2 = object를 넣는다면 object2의 번지 값이 heap에 새로 생기는 것이 아닌 heap 영역에 저장되어 있던 object의 값을 똑같이 가진 이름만 다른 object2 객체가 stack 영역에 저장 된다.
그러니까 결론은 같은 값을 가진 객체라 하더라도 object2 = object 라고 하면 안 되고
calssName object2 = new calssName을 해줘야 한다는 말이다. 빌드업이었다.
Garbage Collection
heap 영역 자동정리 시스템인데 그 자동이 발동 되는 시점은 stack 영역에서 번지를 부르는 변수가 없을 때이다.
프로그램을 끄면 stack의 값들이 사라지면서 heap 또한 정리가 되지만 우리는 빅데이터를 할거라 바로바로 지워주어야 하는데 이를 어떻게 하는가?
object = null; 로 값을 지워준다. 이렇게 값을 지우고 나면 그 이후에 뭔가를 해도 진행 되지 않는다.
그런 뒤에 object2로 뭔가를 하는 것은 가능하다. 그런데 object2 = null을 해주면 stack에 object 들의 값이 없기에 heap영역의 번지 또한 사라진다. - 강제로 Garbage Collection을 시동하는 방법이다.
진도는 요정도 나가고 금요일이기에 또 저번 처럼 시간을 보내보자 하셨다.
전에 만든 비만도 검사를 객체지향으로 디자인 하라 하셨다.
근데 이제 상황극을 곁들인..
이런식으로 클래스를 역할?별로 나눈 다음 메인이 들어갈 클래스는 최소화 시키고 누군가가 소스를 봤을 때 최대한 직관적이게 만드는 것이 객체지향프로그래밍이라고 하셨다.
다음은 UpDown 게임
그 다음은 가위, 바위, 보를 만드는데 어제와 같은 느낌이다.
그냥 예제 못 푼다고 신경쓰지 말고 마음 놓고 배우고 복습하고 혼자 예제 다시 풀어보고 해야겠다.
괜히 왜 못하지 하니까 스트레스만 받는다.
'비전공자의 코딩 일지 > 학원 수업 정리' 카테고리의 다른 글
코딩 학원 11일차 (Java 객체 간의 관계) (2) | 2022.06.21 |
---|---|
코딩 학원 10일차 (Java 객체 지향) (0) | 2022.06.20 |
코딩 학원 8일차 (Java 배열) (0) | 2022.06.17 |
코딩 학원 7일차 (Java 응용 및 심화) (0) | 2022.06.15 |
코딩 학원 6일차 (Java 반복문) (0) | 2022.06.14 |