본문 바로가기
  • soobinhand의 기술 블로그
728x90

전체 글119

[자료구조] Graph 개인적으로 나는 그래프가 어렵다. 자료구조를 배운 이래, 가장 진입하기 힘들었던 자료구조다. 물론 아직도 잘 모른다. 더욱이 이를 활용한 문제 풀이는 아직 먼 산이다... 그러므로 그래프에 대해 공부해본다. 자바로 한다. 그래프는 정점을 간선으로 연결한 것 그 이상도 이하도 아니다. 가장 단순한 모델은 무방향 그래프. 그래프의 정의는 이렇다. 정의 | 그래프는 정점의 집합과 그 집합의 정점 쌍을 연결하는 간선의 모음이다. 그래서 어디서 이용할까? 지도, 컴퓨터 네트워크, 소셜 네트워크 등등... 어떤 항목들을 연결하는 것이 핵심이다. 연결은 어떤 관계를 의미한다. 즉, 특정 항목들의 연결 상태, 경로 추적 등등에서 이용된다. 용어 정점, V | 쉽게 생각하면 꼭짓점이다. 간선, E | 쉽게 생각하면 선분.. 2022. 1. 31.
[SpringBoot] Spring Boot가 뭔데? 왜 쓰는데? JAVA 언어를 사용한다면 한 번 쯤은 Spring이나 Spring Boot를 들어봤을 것이다. 근데 이게 무엇이고 왜 나왔고, 왜 사용하는지는 잘 모를 수도 있다. Spring Boot를 알아보기 전에 먼저 Spring에 대해 간단히 알아보자. Spring Spring 홈페이지에 따르면, Spring은 자바 프로그래밍을 더 빠르고 쉽고 안전하게 해준다. 또 속도, 단순성, 생산성에 초점을 맞췄다. Spring은 세계에서 가장 유명한 자바 프레임워크이다. 결국 Spring은 자바 프레임워크라는 것이다. 결론적으로 자바 기반으로 다양한 어플리케이션을 만들기 위한 툴이다. 이는 Spring은 개발자가 비즈니스 로직에 집중할 수 있도록, 자바 기반 엔터프라이즈 어플리케이션을 위한 종합적인 기능을 지원한다는 뜻.. 2022. 1. 29.
[JAVA] 클래스, 객체, 인스턴스 컴퓨터를 전혀 모르는 내 친구가 물어봤다. 회사에서 들었는지. "자바에서 클래스, 객체, 인스턴스가 뭐야? 왜 쓰는겨??" 난감했다. 자바를 해왔고, 꽤 자신있다고 생각했는데 말이다. 다 내 오만이었다. 그에게 설명해주려고 공부해본다. 클래스 클래스는 무엇인가? 그냥 순수하게 학급, 반, 수업 등의 뜻이 떠오른다. 또는 자동차 브랜드 벤*의 클래스 시리즈가 생각난다. 영어를 모국어처럼 사용하는 이들은 이러한 어떤 그들만의 뉘앙스로 쉽게 생각할 수도 있을 것 같은데 나는 토종 한국인이라 "클래스"가 풍기는 뉘앙스를 알아차리는데 꽤 오랜 시간이 걸렸다. "불 좀 주라" 했을 때, 라이터를 달라는 뜻인것을 우리 한국인은 안다. 하지만 미국인이라면 그 뉘앙스를 알아차리기 힘들 수 있다. 객체지향 언어에서는 소프.. 2022. 1. 28.
아이템 12 - toString을 항상 재정의하라. toString의 규약은 "모든 하위 클래스에서 이 메서드를 재정의하라"고 한다. toString을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고, 그 클래스를 사용한 시스템은 디버깅하기 쉽다. toString 메서드는 객체를 println, printf, 문자열 연결 연산자, assert 구문에 넘길 때, 혹은 디버거가 객체를 출력할 때 자동으로 불린다. 실전에서 toString은 그 객체가 가진 주요 정보 모두를 반환하는게 좋다. 포맷을 명시하든 아니든 여러분의 의도는 명확히 밝혀야 한다. 핵심 정리 모든 구체 클래스에서 toString을 재정의하자. 상위 클래스에서 이미 알맞게 재정의한 경우는 예외다. toString을 재정의한 클래스는 사용하기도 즐겁고 그 클래스를 사용한 시스템을 디버깅하기 쉽게 해.. 2022. 1. 27.
아이템 11 - equals를 재정의하려거든 hashCode도 재정의하라. 핵심 정리 equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다. 그렇지 않으면 프로그램이 제대로 동작하지 않을 것이다. 재정의한 hashCode는 Object의 API 문서에 기술된 일반 규약을 따라야 하며, 서로 다른 인스턴스라면 되도록 해시코드로 서로 다르게 구현해야 한다. 이렇게 구현하기가 어렵지는 않지만 조금 따분한 일이다. 관련 코드 https://github.com/Soobinhand/effective_java/tree/master/src/Item_11 GitHub - Soobinhand/effective_java: 이펙티브 자바 이펙티브 자바. Contribute to Soobinhand/effective_java development by creating an acco.. 2022. 1. 27.
아이템 10 - equals는 일반 규약을 지켜 재정의하라. equals를 재정의하지 않는 것이 최선일 때. 각 인스턴스가 본질적으로 고유하다. 인스턴스의 '논리적 동치성'을 검사할 일이 없다. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. 클래스가 private이거나 package이고 equals 메서드를 호출할 일이 없다. equals를 재정의할 때는 반드시 일반 규약을 따라야 한다. 다음은 Object 명세에 적힌 규약이다. 반사성. x=x여야한다. 대칭성. x=y라면 y=x여야 한다. 추이성. x=y이고 y=z라면 x=z여야 한다. 일관성. x=y를 반복해서 호출해도 항상 값은 같아야 한다. null-아님. x=null은 무조건 false다. 이러한 equals 규약을 어기면 그 객체를 사용하는 다른 객체들이 어떻게 반응할지 알 수.. 2022. 1. 27.
[데이터베이스] 트랜잭션, Transaction 트랜잭션은 영어로 transaction이다. 그럼 transaction의 뜻은 뭘까? 그냥 영단어 사전엔 "거래" 라고 나와있다. 나는 이걸 어느정도 받아들이며 트랜잭션에 대해 공부하려 한다. 물론 컴퓨터에서 말하는 트랜잭션이 거래와 동일한 뜻은 아니다. 하지만 비슷하다고 생각한다. "거래"와 연관지어 공부해보겠다. 정의 트랜잭션은 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위이다. 데이터베이스를 변경시키는 것은 INSERT, UPDATE, DELETE, SELECT 등이 있다. 하나의 트랜잭션은 Commit or Rollback이 되어야만 한다. Commit or Rollback 아까 말한 거래와 연관지어 보자. 엄마한테 용돈을 10만원만 달라했다. 엄마는 아들이 불쌍하여 보내주셨다. 근데 .. 2022. 1. 27.
아이템 9 - try-finally 보다는 try-with-resources를 사용하라. 전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. 핵심 정리 꼭 회수해야 하는 자원을 다룰 때는 try-finally 말고, try-with-resources를 사용하자. 예외는 없다. 코드는 더 짧고 분명해지고, 만들어지는 예외 정보도 훨씬 유용하다. try-finally로 작성하면 실용적이지 못할 만큼 코드가 지저분해지는 경우라도, try-with-resources로는 정확하고 쉽게 자원을 회수할 수 있다. 관련 코드 https://github.com/Soobinhand/effective_java/tree/master/src/Item_9 GitHub - Soobinhand/effective_java: 이펙티브 자바 이펙티브 자바. Contribute to Soobinh.. 2022. 1. 27.
아이템 8 - finalizer와 cleaner 사용을 피하라. 자바는 두 가지 객체 소멸자가 있다. 그 중, finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다. 오동작, 낮은 성능, 이식성 문제의 원인이 되기도 한다. 기본적으로 '쓰지 말아야' 한다. cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다. 즉, 두 객체 소멸자는 제때 실행되어야 하는 작업엔 절대 사용하면 안된다. 상태를 영구적으로 수정하는 작업에서는 절대 두 객체 소멸자에 의존해서는 안 된다. 두 객체 소멸자는 심각한 성능 문제도 동반한다. finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수도 있다. 그렇다면 파일이나 스레드 등 종료해야 할 자원을 담고 있는.. 2022. 1. 27.
아이템 7 - 다 쓴 객체 참조를 해제하라. 가비지 컬렉션을 사용한다고 해서 메모리 관리에 더 이상 신경 쓰지 않아도 되는 것은 절대 아니다. 가비지 컬렉션에서는 메모리 누수를 찾기가 아주 까다롭다. 객체 참조 하나를 살려두면 가비지 컬렉터는 그 객체가 참조하는 모든 객체를 회수하지 못한다. 이러면 악영향을 줄 수 있다. 해법은 간단하다. 해당 참조를 다 썼을 때, null 처리(참조 해제)하면 된다. 객체 참조를 null 처리하는 것은 예외적인 경우여야 한다. 프로그래머는 비활성 영역이 되는 순간 null 처리해서 해당 객체를 더는 쓰지 않을 것임을 가비지 컬렉터에 알려야 한다. 일반적으로 자기 메모리를 직접 관리하는 클래스라면 프로그래머는 항시 메모리 누수에 주의해야 한다. 캐시 역시 메모리 누수를 일으키는 주범이다. 객체 참조를 캐시에 넣고 .. 2022. 1. 27.
728x90