스프링을 주제로하여 스터디를 개설하였고 이번주는 두번째주였다.
두번째라 그런지 첫째주에 비해 확실히 편안하게 진행할 수 있었다.
풀잎스쿨이란 ?
Flipped school
Flipped learning 방식으로 함께 공부하며 성장하는 스터디 모임이에요. (기수제 I 8주 또는 11주)
발표는 매주 2명씩 하기로 하였으며 이번주는 나와 hs님이 진행하게 되었다.
커리큘럼내용이 부실하여 시간을 허비할까 걱정이 앞섰던 나는 발표를 진행하기 앞서 커리큘럼 진행상황에 대해 팀원분들의 의견을 여쭤보았다.
Q. 혹시 첫번째주차 진도 및 학습을 진행해주시면서 어렵다거나, 개선사항이 있으신분 계실까요 ?
A1: 대부분의 팀원들이 직장인이니 너무 타이트하게 생각하지 않으셔도 되요 스프링 입문하기 반인걸요.
A2: 처음부터 모든 것들을 얻을 수는 없어요 오히려 많이하려다보면 참석하지 않는분이 있을 수 도 있는걸요 ?
A3: 지금 진행도 좋은 것 같습니다.
나는 팀원들의 퇴근 후 소중한 시간들을 11주라는 긴 시간동안 헛되이 하기싫었다.
(모든사람이 그렇겠지만 ..)
그렇게 의견을 듣고 이번주차 주제인 객체지향에 대해 발표를 시작하였다.
hs님께서 먼저 객체지향에 대해 간략하고 깔끔하게 정리와 개념설명을 해주셨다.
그리고 자바 현직자도 놓칠 수 있는 부분이라며 jvm GC, jvm heap 영역에 대한 주제로 발표를 해주셨다.
hs님이 직접 겪은 에러들과 경험담을 얘기해주는걸 들으며 감회가 새로웠다. (역시 현직자 ..)
그 중 자바 언어를 사용할 경우 GC가 있으니 메모리 관리를 안해도 되지 않을까 라며 질문을 던져주셨다.
GC가 부여되지 않는 경우도 있어 이 경우 메모리 할당만 되고 해지는 되지 않는다고 한다.
한 번은 그로 인해 매일 24시간 주기로 애플리케이션이 oom 메모리 초과로 인해 뻗었다고 한다. (이후 디버깅?을 통해 찾아내셨다고 ..)
그리고 컴퍼일러에 대해서도 말씀해주셨는데
jvm의 경우 운영체제 위에 jvm이 있어 운영체제 친화적이라고 하였다. 즉 모든 os에 대해 동일한 소스코드를 적용시킬 수 있는 것이다.
c언어의 경우 코드를 통해 운영체제별로 컴퍼일러를 설정해준다고 하며 소스코드를 직접 보여주셨다. (개념적으로만 알고있었어서 소스코드를 보니 새로웠다)
그리고 jvm의 GC에 대해서 설명해주셨다.
Eden, survival 0, survival 1 → minor GC
old generation → major GC
자주 메모리가 해제되는 경우는 minor GC 그 반대는 major GC에 할당된다고 하시며 이외에도 자세하게 설명해주셨다.
그리고 이어서 두번째 발표자는 나였다.
발표자료는 이와 같다.
영상을 토대로 정리한 글을 통해 발표했던 나는 다행히 긴장하지 않고 최대한 쉬운말로 설명하려 했으나 나의 어휘력 부족으로 가끔 단어선택이 이상하여 팀원분들이 몰래 웃으셨다.
객체지향 개념을 시작으로 클래스, 객체, 메서드, 호출스택, 다형성 등의 순서로 진행했다.
여기서 인스턴스 메서드, 클래스 메서드에 대해서 설명해보았다. 클래스 메서드의 경우 인스턴스 변수를 사용할 수 없으며 지역변수만 사용가능한 점을 알게되었다.
인스턴스 변수에 대해 각 메서드가 입력을 받아 사용할 수 있는지에 대한 문제도 출제를 했었다. (팀원분들이 쉽게 맞춰주셨다 🙂)
포함관계에 대해서도 설명해보았다.
상속은 사용하기 드물고 보통 포함관계를 많이 사용한다고 강사님이 말하셨다. 그 이유는 상속을 하게되면 조상의 모든 변수 및 특성을 물려받기 때문에 코드 작성시 제한되는 부분이 많기때문이다.
다형성이란 여러가지 형태를 가지는 능력이며 타입 불일치를 통하여 다양한 형태를 가지는 특성을 설명하였다. 이 다형성을 통해 중복되는 코드를 크게 제거할 수 있었다.
매개변수 다형성 예제코드
class Product {
int price; // 제품의 가격
int bonusPoint; // 제품구매 시 제공하는 보너스점수
Product(int price) {
this.price = price;
bonusPoint = (int)(price/10.0); // 보너스점수는 제품가격의 10%
}
}
class Tv1 extends Product {
Tv1() {
// 조상클래스의 생성자 Product(int price)를 호출한다.
super(100); // Tv의 가격을 100만원으로 한다.
}
// Object클래스의 toString()을 오버라이딩한다.
public String toString() { return "Tv"; }
}
class Computer extends Product {
Computer() { super(200); }
public String toString() { return "Computer"; }
}
class Buyer { // 고객, 물건을 사는 사람
int money = 1000; // 소유금액
int bonusPoint = 0; // 보너스점수
void buy(Product p) {
if(money < p.price) {
System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
return;
}
money -= p.price; // 가진 돈에서 구입한 제품의 가격을 뺀다.
bonusPoint += p.bonusPoint; // 제품의 보너스 점수를 추가한다.
System.out.println(p + "을/를 구입하셨습니다."); // p = p.toString
} // tv가 들어오게되면 tv의 toString이 넘어옴
}
class Ex7_8 {
public static void main(String args[]) {
Buyer b = new Buyer();
b.buy(new Tv1()); // buy(Product p)
//Product p = new Tv1(); 위 줄과 같은 것
//b.buy(p);
b.buy(new Computer()); // buy(Product p)
System.out.println("현재 남은 돈은 " + b.money + "만원입니다.");
System.out.println("현재 보너스점수는 " + b.bonusPoint + "점입니다.");
}
}
위 코드에서 buy 메소드가 입력받을 수 있는 타입은 product 타입이다. tv와 computer가 product를 상속받지 않았더라면 저렇게 사용할 수 없다. 왜냐하면 tv, computer는 매개변수 타입인 product와는 자손관계도 아니며 아무 관련이 없기 때문이다. 하지만 product를 상속받았으므로 product 타입요청에도 tv, computer 객체를 사용할 수 있는 특징이 있다. 그리고 위 코드에서 super, this, toString 등 자주 사용되는 기능들이 있으니 잘 살펴보도록 하자.
참조변수 p와 문자열이 결합하게 되면 toString을 호출하므로 p = p.toString 이다. 이는 애초에 이렇게 설계되었다고 한다.
발표를 마치고 팀원분들과 커리큘럼에 대해 의견을 나눈 결과 스프링 입문책을 사용하기로 하였다.
처음 나는 기존에 정한 커리큘럼을 빠르게 끝내고 책으로 다시 더 깊게 공부를 해야하나 싶었지만 팀원 한분께서 어차피 실습하면서 구글링 하며 찾아볼텐데 책을 참고하며 개념을 확실히 하는것은 어떠냐는 제안을 해주셨으며 감사하게도 팀원분들이 모두 동의해주셨다.
좋은 책을 참고하는 만큼 깊이있는 공부를 해보자 !