풀잎스쿨 3주차 리뷰

리브리버·2022년 9월 30일
0

풀잎스쿨

목록 보기
3/6
post-thumbnail

9/27

이번주는 3주차였으며 발표는 kr님이 맡아주셨다.

발표 주제는 객체지향의 추상화, 다형성, 인터페이스등이 있었다.

이번 발표는 실습위주로 진행해주셨다.

풀잎스쿨이란 ?
Flipped school
Flipped learning 방식으로 함께 공부하며 성장하는 스터디 모임이에요. (기수제 I 8주 또는 11주)

이번주 발표자분께서 간단하게 개념 설명 후 실습위주의 스터디를 진행해주셨다.

(나를 포함한 몇몇 팀원분들이 조금은 어려워하였던건 안비밀이다 ..)

각 객체 배열을 다루는 법, 추상클래스, 추상 메서드 다루는 법을 잘 이해할 수 있었다. 하지만 수업을 진행하며 직접 작성을 해보려니 어려운 부분이 많았다.. 분명 쉬운 예시임에도 불구하고 다시 부족한 나를 볼 수 있었다.

언어 공부를 할때 개념뿐만이 아니라 간단한 예시라도 작성해보며 예시코드를 통해 얻어가는 중요함을 알 수 있었다.

예시 중 추상클래스에 관한 내용을 아래 소스코드를 참고해보자.

abstractPractice

public class abstractPrac {
	  public static void main(String[] args) {
	    // 서로 다른 객체 생성
	    Juice j = new Juice();
	    Coffee c = new Coffee();
	    Beer b = new Beer();
	    Water w = new Water();
	    Tea t = new Tea();
	    // 추상클래스를 통한 그룹화
	    Drink[] drinks = { j, c, b, w, t };
	    // 그룹화된 객체들의 주문 결과 출력
	    for (Drink d : drinks) {
	      d.ordered();
	    }
	  }
	}

abstract class Drink{ 

}

class Juice {
	String name;
	double price;
	public void ordered() {
		System.out.println("주문되었습니다.");
	}
}
class Coffee {
	String name;
	double price;
	public void ordered() {
		System.out.println("주문되었습니다.");
	}
}
class Beer {
	String name;
	double price;
	public void ordered() {
		System.out.println("주문되었습니다.");
	}
}

class Water {
	String name;
	double price;
	public void ordered() {
		System.out.println("주문되었습니다.");
	}
}
class Tea {
	String name;
	double price;
	public void ordered() {
		System.out.println("주문되었습니다.");
	}
}

abstractSolution

public class abstractSolution {
	  public static void main(String[] args) {
	    // 서로 다른 객체 생성
	    Juice j = new Juice();
	    Coffee c = new Coffee();
	    Beer b = new Beer();
	    Water w = new Water();
	    Tea t = new Tea();
	    // 추상클래스를 통한 그룹화
	    Drink[] drinks = { j, c, b, w, t };
	    // 그룹화된 객체들의 주문 결과 출력
	    for (Drink d : drinks) {
	      d.ordered();
	    }
	  }
	}

abstract class Drink{ 
	String name;
	double price;
	public void ordered() {
		System.out.println("주문되었습니다.");
	}
}

class Juice extends Drink{}

class Coffee extends Drink{}

class Beer extends Drink{}

class Water extends Drink{}

class Tea extends Drink{}

이렇게 추상클래스를 이용하게 되면 중복을 아주 크게 줄일 수 있다.

발표가 끝난 후 1시간이 조금 넘게 남아 어떤 주제로 얘기를 해볼까 하다 다음날 자바스터디 발표자료로 Object, 오버라이딩을 준비했던게 기억이 나서 그 주제로 예시코드를 보여드리며 자유롭게 토론을 해보았다.

예기치 못한 주제여서 그런지 팀원분들께서 재밌게 토론에 참여해주셨다.

아래 Object, 오버라이딩에 관련된 예제 소스코드를 참고해보자.

package programmers.intermediate;

import java.util.Objects;

public class Student {
    String name;
    String number;
    int birthYear;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true; // 같은 객체참조값을 가지고 있는지 체크 만약 같다면 true 반환
        if (!(o instanceof Student)) return false; // 같은 클래스인지를 상속을 통해 확인, 같은 클래스가 아니라면 비교할 필요가 없으므로
        Student student = (Student) o; // 객체 형변환(다형성)
        return number.equals(student.number); // Student형 변환을 하여 student 객체의 number값이 같다면 true 반환
    }

    @Override
    public int hashCode() { // hashCode가 구현되는 것은 일종의 수학식, 31과 특정수를 곱함 ...
        return Objects.hash(number); // number를 기준으로 number가 같으면 동일한 hashCode를 가지도록 hashCode를 구현하였음
    }
    // 해시코드를 사용하는 이유는 스트링 값을 통해 만들 수 있는 경우의 수가 해시코드의 값보다 크기 때문에 해시코드가 중복될 수 있다
    // equals를 사용할때 해시코드로 먼저 판별하는데 그 이유는 해시코드가 int이므로 비교가 더 빠르기 때문이다
//

    @Override
    public String toString() { // toString 을 사용하는 경우는 속성값을 원할때가 많으므로 속성값을 반환하도록 오버라이딩 한다
        return "Student{" +
                "name='" + name + '\'' +
                ", number='" + number + '\'' +
                ", birthYear=" + birthYear +
                '}';
    }

    public static void main(String[] args) {
        Student s1 = new Student();
        s1.name = "river";
        s1.number = "9297";
        s1.birthYear = 1234;

        Student s2 = new Student();
        s2.name = "river";
        s2.number = "97";
        s2.birthYear = 1234;

        if(s1.equals(s2)) {
            System.out.println("s1==s2");
        } else {System.out.println("s1 != s2");}

        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());

        System.out.println(s1.toString());
        System.out.println(s1);
        System.out.println(s2.toString());
    }
}

이때 새롭게 알게 된 사실은

스트링 불변객체 - 같은 스트링 값일 경우 객체를 다르게 생성하여도 동일한 주소를 가리킨다는 것

이었다. 여기서 불변성이 등장하게 되는데 그 이유를 아래와 같이 살펴보겠다.

Java에서 String 객체는 immutable, 즉 불변성이라는 특성을 가지는데, Java 언어를 디자인한 사람들은 왜 그런 선택을 한 것일까?

String pool

String이 불변이므로 String pool도 존재한다.

어떤 프로그래밍 언어라도 String 타입은 매우 빈번하게 사용된다. 그래서 Java에서는 String Pool이라는 공간에 String을 포함시켜서, 매번 String객체를 새로 생성하기보다는 값이 같은 String이라면 String pool에 있는 객체를 재사용할 수 있도록 구현했다.

즉 값이 같은 String은 String Pool 내에서 String 객체를 공유하도록 한 것이다. 그런데공유를 하려면 String은 반드시 immutable, 즉 불변이어야 한다. mutable하다면 두 객체의 공유는 불가능하다.

String s1 = "Hello";
String s2 = "Hello";

위 코드의 s1과 s2는 “Hello”라는 value를 갖는 String Pool내부의 하나의 String객체를 가리키고 있다. 이때 s1을 “Hi” 값으로 바꾸게 되면 s1은 새로운 String Pool 내부의 String 객체를 가리키게 된다. (이때 String Pool내부에 이미 “HI”값이 존재한다면 그 객체주소값을 가리키게 된다.)

따라서 Java는 String Pool을 구현하기 위해 String 객체를 immutable하게 만드는 것이다.

위 내용을 마무리로 스터디가 끝나고 드디어 다음주부터 스프링에 대해 스터디를 시작하게 되었다 !

실습소스코드와 책을 통해 스프링을 할 생각을 하니 벌써부터 설렌다 ..!

첫 주에 다짐했던 목표설정을 잊지않으며 앞으로도 힘을 내보려 한다.

화이팅이다 !!

아래는 집에서 찍은 사진이다. 예뻐서 가져와보았다.

참고 : https://starkying.tistory.com/entry/why-java-string-is-immutable

0개의 댓글