본문 바로가기
비전공자의 코딩 일지/학원 수업 정리

코딩 학원 10일차 (Java 객체 지향)

by Hoder2 2022. 6. 20.

-static

 

오늘은 그렇게나 많이 써댔지만 뜻은 몰랐던 static에 대해 알려주셨다.

 

쇼핑몰에서 마우스를 파는데

제품명은 로지텍 123, 가격은 10000원인 마우스의 정보 출력.

사진이 없는데 ShoppinMoll이라는 클래스에서 method를 끌어왔다 보면 된다.

객체지향을 잘한다는 말은 static을 잘 쓴다는 말과도 같다 하셨다.

 

쇼핑몰에 마우스만 있는건 아니라며 게장을 위랑 동일하게 만들라 하셨다.

위 두개의 게장은 모두 김수미시가 만든다.

멤버 속성의 공통된 속성을 표현할 때 쓰는 것이 바로 static인데

이런식으로 멤버변수에서 static으로 producer를 묶어주면 메인 method에서 값을 따로 넣을 필요가 없다.

그런데 위 처럼 static을 변수 앞에 붙히지 않아도

이렇게 김수미가 정상 출력된다.

static을 붙히지 않을 시 heap 영역에 똑같은 값을 가진 다른 번지가 생성이 되어 메모리 공간을 차지 하게 되지만

static을 붙히게 되면 앞서 게속 언급 됬던 RAM의 3가지 공간, ?, stack, heap 공간 중 ?에 해당 되는 static이라는 공간에 김수미라는 하나의 값만 만들고 같이 사용하게 되며 메모리가 절약 된다.

static 자체를 배운 것도 흥미로웠지만 '?' 공간이 static이였다니...

 

 위 처럼 sM3에서 producer 값을 최수미로 바꾸게 되면

이렇게 밑에 있던 sM4 까지 최수미로 변경이 되는데 같이 쓰고 있던 값을 바꿔버려서 그렇다.

 

그리고 static에 담긴 값은 객체가 없어도 사용이 가능한 정보라하셨다.

한국어로 설계 - 번역[개발] - .java - 기계어로 번역[compile] - .class - 실행(을 하게 되면)
1. 제일 먼저 static 멤버변수들이 메모리공간에 만들어짐.
2. 프로그램이 진행.
그렇기에 객체가 없어도 사용이 가능한 것이다.

 

이번엔 쇼핑몰에 컴퓨터를 판다.

근데 이 쇼핑몰은 죽어도 삼성 컴퓨터만 파는 곳이라고 한다.

final은 값 수정이 불가하게 '상수화'를 시켜주며 아까 최수미 처럼 값을 바꾸게 될 시 에러가 난다.

이 바닥의 약속에 의하면 상수명은 눈에 잘 보이게 전부 대문자로 써줘야 한단다.

 

그리고 method에 있는 static도 있는데 이거는 왜 이 자리에 있는거고 왜 사용하는 것일까?

 

아까 static에 담긴 값은 객체가 없어도 사용이 가능한 정보라는 설명을 할 때 Java 실행 파일을 실행하기 까지의 과정을 나열 했었는데 사실 여기에 여러 순서가 더 있다고 하셨다.

한국어로 설계 - 번역[개발] - .java - 기계어로 번역[compile] - .class - 실행
1. JRE가 JVM(Java Virtual Machine)을 만들어서 OS에 띄움, 그래서 한번 만들어 놓으면 운영체제 별로 따로 만들지 않아도 된다. 그래서 느리다.
2. 기계어 상태의 모든 소스가 stack 영역에 전부 실리고 시작.
3. 제일 먼저 static 멤버변수들이 메모리공간에 만들어짐.
4. JVM이 OMain.main(...)를 호출 (그래서 우리가 method 안에 소스를 쓰는 것.)

 

아무튼 그래서 메모리 절약과는 관계가 없고 단지 객체를 만들지 않고 사용 가능한 method이다.
그리고 이는 static이 아닌 멤버에는 접근이 불가하다.

 

실습 느낌으로 정수 2개 넣으면 합 구해주는 계산기를 만들라고 하셨다.

보통 이렇게 만들었을 것이란다. (물론 나도 그랬다.)

그러더니 질문을 던져주셨다.

"객체를 왜 만드십니까?"

 

변수 만드는 이유? = 데이터 저장하려고

객체 만드는 이유? = 실생활스럽게 데이터 저장하려고

 

요점은 우리가 만든 소스는 굳이 필요없는 stak 공간에 데이터를 잡아 먹었다는 소리다.

위 소스에는 멤버 변수가 없다. 그렇다면 저장할 데이터가 없다는 소리이고 그것은 또 객체를 만들 필요가 없다라는 말이다.

위 사진 처럼 만들 경우 변수 하나 없이(데이터 쓰는 것 하나 없이) 소스를 적을 수 있으며 이런 기술이 고급 기술이고 이런 기술들이 모여 객체지향을 잘한다는 말을 들을 수가 있다 하셨다.

 

그런데 아까 메모리 절약과는 관계가 없다 하셨는데 위에 방식은 메모리를 절약하는 방식으로 소스를 짠 거라 뭔가 이상해서 여쭤보니 메모리 절약을 위해서 만들어진 기능은 아니지만 어쩌다보니 이런식으로 활용이 가능한 경우라고 하셨다. 내가 내린 결론은 소스를 편하고 간결하게 짜기 위한 기능 정도인 것 같다.

 

그럼 이번엔 정수 3개의 합을 출력해주는 것을 만들어 보란다.

-method overloading

 

본질적으로 기능이 같은데 method 명을 다르게 해야하는가?

파라메터가 다르면 메소드명은 같아도 되니 일부러 메소드명을 같게 하는 행위가 바로 method overloading이라는 것이다.

위 사진의 내 소스 처럼 hab2 hab3 이렇게 구분지을 필요 없이 hab이라는 method 명으로 통합 해도 된다는 말이다.

 

근데 이런식으로 100만개 짜리 정수 합 구하는 것도 만들어달란다.

당황스러웠지만 곧바로 정답을 알려주셨다.

 

이때 써먹으려고 method를 함수라고 뻥치면서 교육할 때 안 알려준 것이 하나 있으며 그게 바로 파라메터를 무한대로 받는 방법이라 하셨다.

이렇게 하면 파라메터  int를 무제한으로 넣을 수 있으며 method 내부에서는 배열 형태로 사용된다.

그래서 해당 method 안에 for문을 이용하여 집어 넣었던 값을 전부 곱하는 소스를 만들 수 있다.

-constructor(생성자)

 

이번엔 제비뽑기기계를 만들라하셨다.

근데 이제 여기에 글자 몇개 넣으면 점심메뉴 뽑아주는 기능과 회식메뉴 뽑아주는 기능을 추가해보라 하셨다.

이렇게 아까 배운 무한 파라메터를 이용해서 만들었다.

강사님 해설에 의하면 method 안에 들어갈 변수는 한번 쓰고 버릴 애들을 넣는 것인데 Random p 같은 경우 기계의 엔진에 해당하는 부분인데 이것은 밖으로 나가서 멤버변수로 써야하지 않나? 그렇게 하자니 밖에 꺼내놓으면 쓰레기코드가 되고 static을 붙히자니 애매하다. 여러 기계의  들어가는 같은 부품이지 이 하나의 부품으로 여러개의 기계가 작동하는 것은 아니니까 말이다.

 

이번 주제인 생성자 constructor는 객체가 만들어질 때 자동으로 뭔가 작업해야 한다면 쓰는 것이다.

리턴이 아예 없으며 메소드명이 클래스명과 같은 위의 소스가 생성자라고 불리는 것이고

(그냥 아무 빈자리에서 ctrl + spacebar 하면 나온다.)

이런식으로 객체 생성만 하고 method를 불러오지 않아도 실행이 된다.

객체지향형 프로그램을 만들 때 객체를 만들고 무조건 이 constructor가 있어야만 하는데 우리는 이 생성자 없이도 잘만 소스를 적어왔다. 이것은 생성자 작업을 전혀 하지 않으면 java가 compile 할 때 기본생성자를 자동으로 만들어서 주기 때문인데 우리는 지금까지 이 기능을 누려왔던 것이다.

 

쉽게 정리하자면

1. 공통속성 = static

2. 기본값 = constructor

위 소스의 public Printer() { 어쩌구 }  이것을 기본생성자(default constructor)라고 부른다.

 

갑자기 프린터를 만들자고 하신 뒤 사람 이름 출력하는 기능을 넣어보자 하셨다.

이런식으로 멤버변수명과 아래쪽 method 파라메터의 변수명(name)이 같다면 어떻게 되나?

가까운 것이 출력된단다. 그렇기에 Java는 멤버변수명과 지역변수, 파라메터명이 같아도 된다.

그런데 동일한 상황에서 변수명 앞에 this. 을 붙히면 멤버변수와 연결이 되므로 구별해야 할 일이 있을 때 써먹으면 된다.

 

그럼 애초에 만들 때 이름이 캐논 123이고 가격이 30만원인 프린터를 만들기 위해 오버로딩된 생성자를 갖고 싶다면

빈칸에 우클릭 - source에서 using 어쩌구 클릭하면 아래 처럼 나온다.

그리고

이렇게 소스를 적으면 객체를 만들면서 즉시 값을 넣어준다.

위의 내용을 익힐겸 야채김밥과 음식을 만들어보라 하셨다.

이런식으로 오버로딩된 생성자를 쓴 다음 원래 하던 방식대로 쓰면 에러가 뜬다. 빨간줄에 마우스를 갖다대면 생성자를 못 찾겠다고 메세지가 보인다. 아까는 알아서 Java가 생성자 만들어 준다했으면서 왜 에러가 뜨는가?

이는 생성자 작업을 전혀 안 하면 컴파일 시 자동으로 생성자를 만들어 준다는 말이기 때문에 이미 오버로드된 생성자를 직접 만들어 놨기에 자동으로 해주지 않는 것이다. 굳이 저 객체를 쓰고 싶다면 Gimbab 생성자를 하나 더 만들어야 한다.

 

굳이 편한 기능(오버로딩된 생성자가) 있는데 쓸 필요 없어 보이겠다만 개발자 같은 경우 오버로드된 생성자를 주로 쓰겠지만 JSP/Spring/Android 같은 경우 자동으로 객체를 생성하는 경우가 있는데 그때 꼭 지들이 마음대로 기본생성자를 쓴다. 그래서 에러가 발생 되는데 직접 만든 것도 아니다 보니 찾기도 어렵단다. 그러니까 굳이 안 쓰더라도 오류 방지를 위해 기본 생성자는 하나 만들고 가는 습관을 들이라고 하셨다.

 

오버로딩생성자는 실제로 자주 써먹는데 단축키가 없어서 만들어서 쓰라하셨다.

window - preferences - general - keys - 단축키 지정할 기능 찾고 - Binding에서 단축키 설정한다.

(강사님은 ctrl + shift + a로 한다 해서 나도 똑같이 따라했다. 겹치는게 은근 많으니 조심하라 하셨다.)

 

그리고 사실 멤버변수는 어디에 있던 순서는 상관이 없지만 이 바닥의 약속으로
1. 멤버변수 나열.
2. 기본생성자 생성.
3. 실제로 써먹을 오버로딩된 생성자.
4. 일반 메소드. (정보출력 등)
이런 순서로 소스를 적는다 하셨다.

 

이 정도면 진도 많이 나갔으니 저번에 만든 홀짝게임의 객체지향버전을 만들어보자 하셨다.

소스를 거진 다 써놓고 아무리 생각해도 for 문이 객체지향적이지 않은 것 같아서 어떻게 해야 하나 머리를 싸매고 있다가 강사님 하시는 거를 지켜봤는데 그냥 쓰면 되는 거였다. 내가 너무 깊게 생각했나보다.


저번주만 해도 method를 불러오고 method에 올바른 값을 적거나 필요한 파라메터를 가져오고 어떤 자료형 변수를 써야하며 method 내의 값은 어떻게 return 하는지에 대한 감이 너무 안 잡혀 있어서 예제를 풀어보는 내내 머리만 굴리고 빨간줄만 없애다가 손도 못 써보고 시간이 지났는데 저번 주말에 복습을 한게 도움이 되었는지 어느 정도 내 스스로 위의 것들을 프로그램이 잘 굴러가게 쓸 수 있다는 점이 너무 즐거웠고 뿌듯했다.