오늘의 개발

    [Books] Java에 초기화 블록이 있다는 사실 아셨나요?

    초기화블록? 그게 뭔데? 🤦‍♀️ 초기화 블록(initialization block)이란? 클래스 필드의 초기화만을 담당하는 중괄호{}로 둘러싸인 블록을 의미한다. 클래스 변수, 인스턴스 변수의 초기화가 복잡하거나 공통된 부분이 많을 경우 초기화 블록을 사용하면 코드를 간결하게 할 수 있다. 초기화 블록은 생성자보다 먼저 호출되며, static 키워드의 유무에 따라 다음과 같이 구분한다. Static Block(클래스 초기화 블록) Instance Block(인스턴스 초기화 블록) Static Block(클래스 초기화 블록) 클래스가 처음으로 메모리에 로딩될 때 단 한 번만 실행 생성자나 인스턴스 초기화 블록으로는 수행할 수 없는 클래스 변수의 초기화를 수행 class InitBlock { static ..

    [Books] 클래스와 객체의 관계가 붕어빵과 붕어빵 틀이 아니라고?!

    붕어빵의 배신 "붕어빵 틀에서 붕어빵을 찍어내지? 그러니까 붕어빵 틀은 클래스가 되는 거고 붕어빵은 객체가 되는 거야. 이 new라는 연산자를 사용해서 붕어빵 틀에서 붕어빵을 찍어낼 수 있어!" 모두가 익숙했던 예시겠지만, 사실 클래스와 객체의 관계는 붕어빵과 붕어빵 틀이 아니다. 바로 예시부터 알아보자. 클래스 객체명 = new 클래스(); 붕어빵틀 붕어빵 = new 붕어빵틀(); // ?? 금형기계 붕어빵틀 = new 금형기계(); // ????? 새로운 금형기계를 하나 만들었더니 붕어빵틀이 되었다? 무언가 잘못된 예제임을 알 수 있다. 클래스와 객체의 관계를 이해하기 전에 먼저 객체가 무엇인지, 클래스는 또 무엇인지 이해해야 한다. 객체(Object)가 뭔데? 세상에 존재하는 모든 것은 사물, 즉 ..

    [Books] 전역변수 사용을 왜 지양해야 할까?

    전역 변수란? static 변수(클래스 변수)란? 여러 인스턴스가 공유해서 사용할 수 있는 변수 인스턴스 변수처럼 객체가 new연산자로 인스턴스화 될 때 생성되는 변수가 아닌, 프로세스가 메모리에 로드되는 순간 정적변수 영역(데이터 영역)에 딱 한번만 생성되는 변수이고, 이는 프로세스가 끝나서 언로드 될때까지 메모리에 상주한다. 따라서 인스턴스의 생성과 상관없이 사용할 수 있다. 전역 변수의 문제점 1. static은 객체 지향적이지 않다. static 변수는 객체 지향의 패러다임과 상반된다. 한 객체가 가지고 있는 데이터들은 외부에서 함부로 접근하여 수정할 수 없도록 해야 한다는 원칙, 즉 OOP에서 중요한 요소 중 하나인 은폐성을 갖추지 못한다. 2. 전체 프로그램과 동일한 라이프사이클 static ..

    [Books] 자바는 어떻게 개발자에 대한 사랑을 실천했을까?

    🧐 새로운 시선으로 바라보는 Java의 특징 1. 플랫폼에 독립적인 언어 “Java가 인간을 사랑한 방법은 바로 가상머신(Virtual Machine)이다.” 0과 1만 있던 기계어에서 인간 지향적인 어셈블리어를 거쳐 강력한 이식성을 가진 C언어에 오기까지 인간을 위해 많은 발전이 있었지만 C언어로 작성한 소스를 다른 기종의 컴퓨터에서 실행하려면 각각의 컴파일러가 필요했다. Java는 기종이 몇 개든 단 하나의 JVM용 기계어를 생성하여 어떤 운영체제에서도 실행이 가능하다. 이게 가능한 이유는 모두 가상머신 덕분이다. Java는 컴퓨터 운영체제에 맞는 VM에 코드를 올려 그 코드가 운영체제에 맞게 해독하도록 변경해 준다. Write once, run anywhere! 2. 객체 지향 언어(OOP, Obj..

    [Spring] IoC(제어의 역전)와 DI(의존성 주입) 그리고 Spring

    IoC와 DI 그리고 Spring 그동안 Spring을 사용하면서 너무도 당연하게 생각했던 개념들에 대해 다시 짚어보려 한다. IoC가 뭔지? DI는 또 뭔지? Spring은 무슨 관련이 있는 거고, 어떤 점이 좋아서 Spring을 사용하는지? 궁금증을 파헤쳐보자! IoC(Inversion of Control) : 제어의 역전 IoC(Inversion of Control)란? 코드 흐름이 제3자에게 위임되는 것 잘 와닿지 않을 수 있으니, 예제를 통해 살펴보자. public class A { private B b; public A() { b = new B(); } } A 클래스에서 B 필드를 가지고 있고, 생성자 내부에서 직접 생성해 필드를 초기화하고 있다. 즉, 객체 생명주기나 메서드의 호출을 개발자가..

    [WIL] 항해99 14주차 회고ㅣ수료식 5관왕을 하다..!

    이번 주 톺아보기 오늘로 항해99가 끝이 났다! 99일 동안 정말 치열하게 달렸던 것 같다. 🎉 기쁨의 수료식 마지막날, ZEP에서 수료식을 진행했다. 수료증과 함께 10기 B반 동료들의 투표를 받아 특별 상장을 수여해 주셨는데, 내가.. 5관왕을 하게 되었다..! 😮😳 동료들이 직접 투표해 준 상이라 더 뜻깊고, 감사했다. (뿌엥😭) 그리고 가장 기뻤던 최고의 프로젝트 상! 우리 팀원들이 함께 이뤄낸 결과라 개인적으로 상을 받았을 때 보다 더 기뻤던 것 같다! ✍ 노력의 흔적들 항해99를 하면서 써 내려갔던 TIL 목록이다. 그날의 배운 내용, 찾아봤던 레퍼런스들, 내 기분, 감정들이 전부 담겨있다. 기록은 나를 성장시킨다. 그리고 나는 이 꾸준함을 믿는다. 앞으로도 멈추지 않고 기록해야지. 이번 주의..

    [WIL] 항해99 13주차 회고ㅣ실전 프로젝트 최종 발표

    이번 주 톺아보기 🔨 끝날 때까지 끝난 게 아니다 벌써 실전 프로젝트 마지막 주차! 유저 테스트 후, 피드백을 반영하여 어느 정도 기능이 마무리되었다. 그렇지만 끝날 때까지 절대 끝난 게 아니지. 팀원들과 Code with me를 하며 그동안 정리하지 못했던 많은 주석과 로그들, 그리고 각자 개발하느라 자주 들여다보지 못한 서로의 코드를 싹 훑으면서 본격 리팩토링에 들어갔다. 처음엔 금방 끝날 거라 생각했는데 막상 까놓고 보니 새롭게 추가되는 기능으로 이전 기능이 필요 없어졌다던가, 다른 사람이 만든 메서드를 제대로 이해하지 못하고 로직을 추가했다던가, 하는 이유들로 생각보다 시간이 꽤 걸렸다. 대공사가 있던 곳은 2군데이다. 1) 중도 이탈 유저에 대한 제출 인원 예외 처리 2) 네이버, 카카오, 구글..

    [눈치 코치 캐치!] DB 동시성 제어 문제 해결

    시작하기 전에 [눈치 코치 캐치!]의 MVP를 완성하고 런칭의 기쁨도 잠시, 다양한 피드백을 마주하게 되었다. 그중 내가 맡아 개선한 부분은 ‘게임 진행 중 시간제한(타이머)’ 기능을 추가한 것이었다. 게임에 참여하고 있는 모든 유저가 키워드나 그림을 제출해야만 다음 라운드로 넘어갈 수 있기 때문에 시간제한을 두지 않으면 게임이 지루해진다는 의견이 있었고, 전적으로 동의했다. 빠르게 기능을 개발하면서 한 가지 문제 상황을 맞닥뜨렸다. 지금부터 이 문제를 해결하기 위해 어떤 시도를 했고, 어떤 방식으로 해결했는지 적어보려 한다. 차근차근 문제부터 뜯어보자! 문제 상황 제한 시간을 넘어 미처 제출하지 못한 유저의 키워드나 이미지가 일괄 자동 제출 되었을 때 DB에 제대로 데이터가 쌓이지 않아 다음 라운드로 ..