2019년 5월 29일 수요일

[봉사 후기] 희애뜰 친구들과 함께 한 하루

 오늘은 희애뜰 친구들과 안녕하세요 캠페인과 홈플러스에서 쇼핑하는 것을 도와주는 활동을 했다. 발달장애가 있는 4~6학년 친구들과 함께 하는 활동이었다. 나는 도경이라는 6학년 여자친구와 짝꿍이 되었는데 도경이는 마치 나의 어릴 적 같아서 더 마음이 갔다. 선생님 말씀 잘 듣고 차분한 친구였다. 그런 도경이를 다른 봉사자 분들과 선생님들도 굉장히 이뻐하시는 것을 볼 수 있었다. 

 안녕하세요 캠페인은 길에서 다른 행인들에게 인사하는 캠페인이다. 지나가는 행인분들은 쑥쓰러워 하시면서도 밝은 얼굴로 바라봐주셨고, 차에 계시던 분들은 대부분 궁금한 표정으로 바라보시고 어떤 분들은 미소로 화답해주셨다. 사람들의 미소를 볼 때 나도 행복해지는 것을 느꼈다. 

 도경이와 홈플러스에서 과자와 음료수를 사고 수련관으로 돌아오면서 많은 이야기를 나눴다. 도경이가 제일 좋아하는 음식이 브로콜리라는 사실에 나는 엄지를 연신 치켜들 수 밖에 없었다. 제일 좋아하는 음식이 브로콜리인 사람은 내 주변에 도경이밖에 없을 것이다. 그 사실만으로 난 도경이가 정말 멋있고 좋았다. 

 비록 길지 않은 시간이었지만 발달장애 청소년들과 함께 시간을 보내고 발달장애에 대해서 따로 공부하면서 많은 것을 알고 느낄 수 있었다.
 1. 발달 장애는 자폐증과 지적 장애로 나눌 수 있고, 자폐증은 지능이 낮은 것이 아니라 감각을 통해 인지되는 자극들이 아주 과도하게 느껴져서 의도하지 않은 행동들이 나타나는 증상을 가지고 있다. 이러한 상황은 사회성을 부족하게 만드는 원인이 된다. 지적 장애는 사회성은 문제 없지만 IQ로 측정할 수 있는 지능이 낮은 상태이다.
 2. 발달 장애 친구들의 행동은 의도하지 않은 것임을 알고 부정적인 시선으로 바라봐서는 안된다.
 3. 장애인과 비장애인은 서로 도우며 살아가야 한다.
 나는 20여년동안 하지장애를 가지신 할머니와 함께 살았다. 그래서 그런지 장애인에 대해 부정적인 시선을 가져본 적이 없다. 다만 아쉬운 것은 노화에 따라서 할머니의 외부 활동이 힘들어지고 사람들과의 소통이 사라지는 것을 개선하기 위한 노력이 부족했던 점이다. 힘든 상황에서도 지금까지 잘 살아와주신 할머니께 감사할 따름이다.

 희애뜰 친구들의 밝은 에너지에 힘을 얻어가는 하루였고, 도경이의 미소를 아마 평생 잊지 못할 것이다! 또 볼런투어에 참여할 수 있기를! 

[운동 후기] 만보 걷기

 요즘 날씨가 좋으면 밖으로 나가서 만보를 채우고 돌아오거나, 약속이 있으면 많이 걸어서 만보를 채우려고 노력하고 있다. 이런 습관을 만들게 된 계기는 김미경 강사님의 북카페 유투브 중 배우 하정우님의 책을 소개한 편을 보고 나서다. 힘들 때, 머릿속이 복잡할 때, 쉴 때 등 시간이 나면 언제든지 걷는다는 배우 하정우님은 걷기를 통해서 다른 일을 할 힘을 얻는다고 했다. 유투브 댓글에 만보 걷기 오픈채팅방이 있는 것을 발견하고 들어갔고 4월부터 틈틈이 만보를 채우기 위해 노력하고 있다. 
 채팅방에는 회사원, 나처럼 일을 쉬고 계신 분 등 다양한 분들이 계시는데, 틈틈이 생활속에서 만보를 채우기 위해 노력하시고 못채울 경우 일부러 산책을 가시거나 퇴근길을 걸으시는 분들이 많다. 다른 사람들의 인증이 만보를 채우고 꼭 운동을 하려는 자극이 된다.

 걷기의 힘과 생활 속 자투리 운동을 무시했던 내가 그 효력을 오롯이 느끼고 있다. 밖을 나가서 걸으면서 다른 사람들의 일상을 바라보고, 다른 운동하시는 분들을 보면서 자극을 받고, 공원의 풀향기도 느끼고 야경도 즐기면서 도심 속 힐링을 즐긴다. 걸을 때 의식적으로 엉덩이와 허벅지에 힘을 주면서 내 근육이 빨리 자라기를 바라기도 한다ㅋㅋ 배우 이정용씨도 다이어트 정체기가 왔을 때 일상 속에서 하는 니트 운동법으로 그 한계를 벗어나셨다고 하니, 일상 속에서 틈틈이 하는 운동이 쌓이고 쌓이면 우리에게 얼마나 큰 변화를 가져다 주는지 꼬옥 느껴볼 것이다. (지금도 앉아서 하는 다리 운동을 하고 있다. 하나 추천하자면 다리를 펴고 발목을 교차시킨 다음에 아래쪽 다리는 위로, 위쪽 다리는 아래로 힘을 주는 것이다! 짱짱!)

 나에게 걷고 뛸 수 있는 힘과 시간과 마음의 여유가 있다는 사실에 감사하다! 

2019년 5월 24일 금요일

[운동 후기] 헬스 시작 일주일차

본격 헬스 시작한지 일주일 차!

평소에 홈트레이닝만 하다가 헬스장에 다니기 시작했다.

처음에 헬스 기구를 무시했는데, 홈트레이닝으로도 충분히 근력을 늘릴 수 있을거라 생각했는데...

헬스장에서의 첫 운동 후 4일째 되는 날까지 엄청난 근육통에 시달렸다. 

헬스장 기구가 근력 향상을 위해 얼마나 과학적으로 만들어진것인지 느낄 수 있었다.

이제 일주일이 조금 넘었는데 당연히 눈에 보이는 변화는 없다. 어깨와 팔뚝 근육이 조금 단단해진 것 뿐?

꾸준히 열심히 해서 한달 후에 내 몸에 어떤 변화가 느껴지는 지 다시 생각해 볼것이다.

원래 마른 체질이고 현재는 근육과 체지방 모두 매우 부족인 상태여서 자연식 위주로 몸무게를 늘리는 것이 정말 어려울 거라 예상된다. 

내가 근육량 증가를 중점으로 헬스를 해야겠다고 마음 먹은 이유는 튼튼하고 단단하게 느껴지는 몸에서도 자신감이 나온다고 느꼈기 때문이다. 마르고 연약해 보이는 몸에서 벗어나서 건강하고 자신감 있는 모습으로 바뀌고 싶다. 

근육량 6kg! 반드시 늘릴 것이다!!!

2019년 4월 28일 일요일

[Effective Java 2nd Edition] Chapter 2. Creating and Destroying Objects -> Item 3. Singleton 속성을 private 생성자나 enum type으로 하자

싱글톤은 클래스를 단 한 번만 인스턴스화해서 재사용 하는 것입니다. 
클래스를 싱글톤으로 만들면 테스트가 어렵습니다. 해당 싱글톤 클래스가 어떤 인터페이스를 구현하고 있지 않은 이상 Mock 구현체로 대체하기 어렵기 때문입니다.
Java 1.5버전 전에는 싱글톤 구현에 2가지 방법이 있었습니다. 두가지 모두 private 생성자를 기반으로 public static member를 노출시키는 전략이었습니다. 
첫번째 방법은 public static final field를 노출하는 것입니다.
두번째 방법은 private static final field를 가지고 getInstance 메소드를 통해서 싱글톤 객체에 접근하는 것입니다.

세번째로 Java 1.5 버전 이후에는 Enum을 활용하여 간결하고 java reflection이나 serialization에 영향을 받지 않는 싱글톤 클래스를 생성하는 방법을 추천합니다.




public class Item3 {
    public static final Item3 INSTANCE = new Item3();
    private Item3() {}

    public void method() {}
}

// second approach: static factory method
// - advantage: You can change your mind
//              whether the class should be a singleton without changing API
class Item3_2 {
    private static final Item3_2 INSTANCE = new Item3_2();
    private Item3_2() {}
    public Item3_2 getInstance() { return INSTANCE; }
    public void method() {}
}

// After 1.5 third approach to implementing singletons
// A single-element enum type
// - advantage1: concise
// - advantage2: serialization machinery for free
// - advantage3: ironclad guarantee against multiple instantiation,
//               even in the face of sophisticated serialization and reflection attack
enum Item3_3 {
    INSTANCE;

    //private Item3_3() {}

    public void method() {
        System.out.println("Item3_3");
    }
}



2019년 4월 21일 일요일

[Effective Java 2nd Edition] Chapter 2. Creating and Destroying Objects -> Item 2. 생성자 파라미터가 많을 때 Builder를 고려해보자.

d어떤 클래스의 생성자 파라미터가 많을 때 흔히 사용하는 패턴에 대해서 소개한다.

1. telescoping constructor pattern

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class NutritionFacts {
    private final int servingSize; //required
    private final int servings;    //required
    private final int calories;    //optional
    private final int fat;           //optional
    ....
    //필수 멤버만 매개변수로 받는 생성자
    public NutritionFacts(int servingSize, int servings) {
        this(servingSize, servings, 0);
    }
    public NutritionFacts(int servingSize, int servings, int calories) {
        this(servingSize, servings, calories, 0);
    }
    public NutritionFacts(int servingSize, int servings, int calories, int fat) {        
        this(servingSize, servings, calories, fat, 0);
    }
    ...
}
cs

생성자를 통해서 설정하려는 매개변수가 많아지면, 매개변수를 순서대로 넣었는지 확인해야만 한다. 

2. JavaBeans pattern

1
2
3
4
5
6
7
8
9
10
11
12
13
public class NutririonFacts {
    private int servingSize = -1// required: no default value
    private int servings = -1;      // required: no default value
    private int calories = 0;      // optional
    private int fat      = 0;
    ...
    public NutritionFacts() {}
    
    //setters
    public void setServingSize(int val) { servingSize = val; }
    ...
}
cs

setter를 통해서 설정해줘야 하는 값이 50개라고 하면.. 참 난감하다. 뭐가 required인지 찾아내는 것도 힘들 것이다. 

다행이 telescoping constructor pattern의 안전성과 JavaBeans pattern의 가독성을 모두 가진 대안이 있다. Builder pattern! 

Builder pattern은 필요한 객체를 직접 만들기보다 필수 매개변수와 함께 생성자나 static factory를 호출해서 builder 객체를 얻는다. builder 객체의 setter-like method를 호출해서 optional parameter를 설정한다. 




//Builder Pattern
public class NutritionFacts {
    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

    public static class Builder {
        //Required parameters
        private final int servingSize;
        private final int servings;

        //Optional parameters - initialized to default values
        private int calories     = 0;
        private int fat          = 0;
        private int carbohydrate = 0;
        private int sodium       = 0;
        
        public Builder(int servingSize, int servings) {
            this.servingSize = servingSize;
            this.servings    = servings;
        }
        
        public Builder calories(int val) {
            calories = val;
            return this;
        }
        public Builder fat(int val) {
            fat = val; 
            return this;
        }
        public Builder carbohydrate(int val) {
            carbohydrate = val;
            return this;
        }
        public Builder sodium(int val) {
            sodium = val;
            return this;
        }
        
        public NutritionFacts build() {
            return new NutritionFacts(this);
        }
    }
    
    private NutritionFacts(Builder builder) {
        servingSize  = builder.servingSize;
        servings     = builder.servings;
        calories     = builder.calories;
        fat          = builder.fat;
        sodium       = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }
}

NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8). calories(100).sodium(35).carbohydrate(27).build();

Builder Pattern을 사용하면 위와 같이 가독성 높고 안전하게 NutritionFacts 객체를 생성할 수 있다!

흔히 Abstract Factory class의 newInstance 메소드가 빌더 역할을 하기도 하는데, 항상 존재하지 않을지도 모르는 기본 생성자를 호출한다는 단점이 있다. (잘 이해가 안된다. 더 공부해야 하는 부분..)

Builder pattern의 단점은 항상 Builder 객체를 먼저 생성해야 한다는 점이다. 어떤 상황에서는 성능 문제를 발생시킬 수 있는 부분이다. 두번째 단점은 코드가 길어지기 때문에 매개변수가 4개 이상이거나 꼭 필요할 때 사용하는 것이 바람직하다. (하지만 후에 매개변수가 많아지는 경우도 있다.) 매개변수가 길어서 눈에 띨 정도면 Builder pattern을 사용하자. 

결론: 클래스의 생성자나 static factory의 매개변수가 많아서 관리가 어려워지면 (특히 optional 매개변수가 많을 때) Builder pattern을 사용하자. 그러면 Client code는 telescoping pattern을 썼을 때보다 훨씬 가독성 높고 JavaBeans를 썼을 때보다 안전해질 것이다. 

2019년 4월 16일 화요일

[Effective Java 2nd Edition] Chapter 2. Creating and Destroying Objects -> Item 1. 생성자 대신 static factory method를 고려해보기


이 단원에서 다루는 것: 
  • 언제 어떻게 객체를 생성해야 하나? 
  • 언제 어떻게 객체를 생성하면 안되나?
  • 언제 소멸되었다고 확신할 수 있나?
  • 소멸 전에 꼭 해줘야 할 액션은?

[Java] "==" vs equals()

"==" equals() 부가설명
operator method Java에서 operator의 overriding은 불가능
Object, Primitive 모두 비교 시 사용 가능 Object 비교 시에만 사용 가능
메모리 참조값 비교 Object class에 정의된 비즈니스 로직대로 비교 만약 Object class의 equals 메소드를 overriding하지 않았다면 "=="와 같은 로직으로 비교를 한다.


String이 같은 문자열을 가지고 있는지 판단할 때, 어떤 것을 사용해야 할까?

equals()를 사용해야 한다.

java.lang.String 클래스는 equals() 메소드를 overriding해 놓았기 때문에 문자열 내용이 같으면 true를 반환한다. 하지만 "=="을 사용할 경우, 같은 내용의 문자열을 가리키고 있더라도 같은 메모리를 참조하고 있어야만 true를 반환한다.