5/2 생활코딩 JAVA - args 전달방법, 입력값/출력값, 객체지향 프로그래밍, static

5.2 생활코딩 자바 수업 내용

- 수강 커리큘럼 : 입력과 출력 ~ 클래스 멤버와 인스턴스 멤버

- 오늘은 블루홀 인턴 지원서를 작성하느라 공부 시간이 많이 부족했다. 오랜만에 파이팅 있게 입사지원서를 써보니 또 옛 생각도 나고 그렇다. 웹젠, 요꼬가와 같은 곳 지원할때만 해도 엄청 어렸던 것 같은데 어느덧 시간이 또 2년이나 지나 있다니.. 어쨌든 내일은 오전부터 좀 더 해야겠다.

1) Java 애플리케이션에 입력값을 주는 법?

- 현재까지 내가 아는 바로는 main 클래스 뒤에 인자를 붙이는 방식이다. main(String[] args) 파라미터1 파라미터2 << 이런식으로 말이다.
근데 궁금한 게 생긴다. main이 String이 아니라 main(int[] args)가 되는 것은 불가능할까? 이런 경우 내부 처리를 int로만하고 int값을 파라미터로 받는 것은 안 되는 건지.. 
어쨌든 console환경에서는 argument를 저런 방식으로 주면 되고, 이클립스에서는 Run configuration에 args 탭이 따로 있어 여기에 인자1(space)인자2 이런 방식으로 입력해주면 인자를 전달할 수 있다. 자꾸 인자라고 하네, 파라미터가 맞는 표현이다. (인자는 주는 놈, 파라미터는 받는 놈)

2) 입력값과 출력값은 뭐고, 왜 그걸 만들었을까?


입력값과 출력값이 없을 때는 메소드를 융통성 있게 활용하지 못했을 것이다. 즉 2+4는 늘 6이라는 값만 return하고 2를 10이나 50으로 바꾸고 싶어도 불가능했겠지. 그러다 보니 수식을 하나 만들어 놓고 이 수식에 넣을 값은 내 맘대로 조정하고 싶었을거다. 마침내 그게 되던 순간! 하드웨어와 결합하며 계산기라는 녀석이 세상에 등장하지 않았을까?
어쨌든, 입력값은 어떤 메소드나 로직에 원료가 되는 값이고 출력값은 원료 값을 메소드나 로직에 태운 뒤에 반환되는 값을 말한다. 아마 같은 수식을 사용하고는 싶지만, 유동적인 결과값을 원해서 이렇게 만들어지지 않았을까?

3) 객체 지향 프로그래밍이란 뭘까? 객체지향 프로그래밍을 나만의 언어로 바꾼다면?

객체지향이라는 말은 너무 어렵다. 일단 나만의 언어로 바꾸자면 객체지향은 '형체 없는 녀석들을 형체 만들어주기' 프로그래밍이다. 이해하고 있다시피, 프로그램이 방대해지면 질수록 이를 잘게 쪼개고 결합하고 대체하는 방식의 프로그래밍이 당연히 필요했을 것이다. 입력값 하나가 프로그램을 좌우하게 하지 않도록 노력하다보니 프로그램이라는 큰 덩어리를 쪼개고 쪼개고 또 쪼개면서, 형체가 없는 녀석들도 억지로 형체를 만들어줬다. 그렇게 하고 난 뒤에 비로소 유지보수를 할 때 억지로 만들어 놓은 그 형체만 손보면 되니 얼마나 편했을까. 객체를 만든다 라는 표현은 결국, 얘를 다를 수 있고 얘를 독립적으로 사용하도록 분리시키기 위해 (어거지로라도) 형체를 만들어주는 것 으로 이해하고 있다.

4) this.left = left에서 this와 left의 각각 의미는 무엇일까?

this는 인스턴스, this.left는 인스턴스의 변수, left는 변수(파라미터)이다.
Java에서 this는 인스턴스 내에서 인스턴스가 자기자신을 가리키는 (파이썬에서는 self) 문법이다.
파이썬은 편의상 self라고 했지만, 혹시 Java에서는 this만 써야하는 것일까?

5) 객체란 상태와 행위의 집합 - HTTP 무상태성과 연결지어서 생각해보자

객체란, 생활코딩 강의에 의하면 변수와 메소드의 결합체이다. 여기서 변수는 상태, 행위는 메소드다. 
데이터와 그 데이터를 가지고 무엇을 할 지? 같은 어감이랄까.
HTTP는 무상태성이라고 한다. 그래서 세션과 쿠키등을 이용하여 데이터의 연속성을 유지하는데 생각해보면 HTTP는 어플리케이션이 아닌 통신규약이기 때문에 이렇게 변수를 유지할 수 없는게 아닐까 싶다. 나중에라도 되짚어보고 이게 맞는 것인지 확인이 필요할 것 같다.

6) 인스턴스변수와 클래스변수의 차이, 언제 쓰는가?


클래스의 하위 개념이 인스턴스이다. 클래스가 붕어빵을 찍어내는 틀이라면, 인스턴스는 붕어빵. 클래스가 설계도라면 인스턴스는 제품이다. 
붕어빵마다 다른 크림이 들어갈 수 있으므로 인스턴스 변수는 인스턴스만의 고유한 값을 갖고 싶을 때 사용한다.
반면에 클래스 변수는 고정적이다. 어느 인스턴스나 똑같은 값을 공유한다면 그 변수는 클래스 변수로 생성되고 이 변수에 모든 인스턴스가 접근하여 값을 취하면 된다.

인스턴스 메소드는 클래스 맴버에 접근 할 수 있다. 클래스 메소드는 인스턴스 맴버에 접근 할 수 없다.
왜일까? 논리적으로 한 번 생각해보자

7) static의 뜻은 무엇인가? - 여태까지 본 바에 의하면 static은 클래스의 소속이 되어버리네?


쉽게 이해하면 현재 나한테는 "static이 붙으면 클래스, static이 안 붙으면 인스턴스" 이다 ㅋㅋ
그런데 파이썬에선 클래스 메소드를 바로 못 쓰고 반드시 인스턴스를 생성해주었어야 하는데 맞나?
만약 그렇다면 인스턴스를 괜히 하나 생성해야 하니까 메모리 낭비가 있었을 것 같다.

잘못 된 설명이었다. static을 쓰면 인스턴스를 생성하지 않고도 사용할 수 있는 멤버가 되는 것이다.
굳이 인스턴스를 생성하지 않고도 정의 된 멤버를 사용할 수 있다는 장점이 있지만
이렇게 되면 static자가 붙은 멤버는 클래스의 소속이 되어 가비지콜렉션 대상이 되지 않는다.
따라서 static의 사용 여부는 잘 판단해야한다.

댓글

이 블로그의 인기 게시물

로컬 Tomcat 서버 실행속도 개선

2019.05.23 - SQLAlchemy 의 객체 상태 관리 (expire, refresh, flush, commit) 에 관한 이해

2020.02.17 Python의 multiprocessing 중 Pool.map(), chunksize에 관한 내용