본문 바로가기

DEVELOP/Java

[Java] Call by Value와 Call by Reference [Java] Call by Value와 Call by Reference 프로그래밍 언어에는 Call by Value와 Call by Reference라는 개념이 있습니다. 함수, 또는 메소드에 파라미터를 넘겨주는 방식에 대한 개념인데요. Call by Value는 값에 의한 호출, Call by Reference는 참조에 의한 호출이라고 번역됩니다. 그럼 각각은 어떤 차이가 있을까요? Call by Value Call by Value는 메소드를 호출할 때, 인자로 넣어주는 변수의 값을 복사합니다. plusOne()이라는 이름의 숫자 num을 받는 메소드가 있다고 하겠습니다. 인자로 들어온 num에 1을 더하는 기능을 합니다. 다음 코드와 같이 plusOne() 메소드를 호출하면 어떤 일이 일어날까요? @.. 더보기
[디자인 패턴] 전략 패턴 [디자인 패턴] 전략 패턴 전략 패턴이란? 위키피디아에 따르면 전략 패턴은 실행 중에 알고리즘을 선택할 수 있게 하는 행위 디자인 패턴이라고 한다. 객체가 선택할 수 있는 행위, 즉 전략을 객체로 간주하여 캡슐화 해놓고 동적으로 변경할 수 있게 한다고 풀어쓸 수 있을 것 같다. 더 직관적으로 줄이면 행동을 객체로 만든다고 할 수 있을 것 같다. 사실 풀어썼다고 해도 이런 식으로는 잘 와닿지 않는다. 전략 패턴의 생겨나게 된 배경부터, 구체적인 사례까지 쭉 살펴보겠다. 전략 패턴은 왜 생겼을까? 미션: 게임의 직업 클래스를 만들자 전략 패턴의 가장 직관적인 예시는 역시 게임 캐릭터라고 생각된다. 새로 오픈하는 RPG 게임에서 캐릭터의 각 직업 클래스를 구현하게 됐다고 해보자. 구현해야 될 직업은 총 5개,.. 더보기
[JPA] N+1 문제 해결 [JPA] N+1 문제 해결 N+1 문제가 발생했다! 이력서 목적으로 웹사이트를 하나 띄워서 운영하고 있다. 오버스펙일 순 있겠지만 컨텐츠는 DB로 별도 분리해서 관리하고 있다. 처음 만들 당시에는 회사에서 JPA를 쓸 일이 없어 JPA로 만들어 봤는데, 딱히 공부를 했다기보단 이렇게 하니깐 CRUD가 되는군, 참 쉽다 요 정도로 사용만 했었다. 그리고 최근에 간만에 이력서 업데이트 겸 프로젝트 업데이트도 했는데 테스트 중에 문제를 발견했다. 컨트롤러 한 번 호출했는데, 쿼리가 몇 개가 나가는거지. 지금이야 JPA 공부를 한 번 해둔 상태라, 어떤 문제인지 바로 알 수 있었다. JPA를 조금만 찾아봐도 들어봤을 N+1 문제였다. N+1이란? 이건 사실 1+N 문제라고 하는 편이 정확하다. N+1이라 하면.. 더보기
[Java] JPA 영속성 컨텍스트 [Java] JPA 영속성 컨텍스트 JPA란? Java Persistence API의 약자. Java도 알겠고, API도 알겠다. 그런데 이 Persistence라는 건 뭘까? persist는 지속된다, 계속된다는 의미이다. 명사형인 Persistence는 무언가가 지속되는 상태 정도라고 볼 수 있다. persistence를 구글링 하면 위키피디아를 연결해주는데, 위키피디아에서는 persistence를 이렇게 말한다. 프로세스가 생성했지만 별개로 유지되는 상태의 특징 중 한 가지. 별도의 기억 장치에 데이터를 보존하는 목적. 이 특징으로 인해 저장 장치로부터 데이터를 전송하는 작업 및 자료구조 등을 이용해 데이터를 보존하는 것이 가능. 여기서 내 마음대로 중요하다고 생각되는 부분을 강조해봤다. 별개로 유.. 더보기
[Java] 객체지향과 SOLID 객체 지향과 SOLID 소프트웨어 공학 내용이지만, 자바와도 연관성도 많으므로 자바 카테고리에 올리는 객체지향 정리. 객체 지향 객체지향은 컴퓨터 프로그램을 객체들의 모임으로 파악하고자 하는 관점. 각각의 객체는 데이터를 주고 받으며 협력한다. 프로그램을 유연하고 변경이 용이하게 만든다는 장점이 있다. 특징과 장점 특징 추상화: 현실세계의 개념을 반영하는 것. 객체들의 공통적인 특징, 데이터와 기능을 도출한다. ex) 요청한 계산을 수행하는 프로그램을 만든다고 했을 때, Calculator라는 이름의 클래스를 만든다. 실제 계산기라고 생각하고 기능을 구현한다. 인간의 사고방식과 프로그램의 동기화. 캡슐화: 객체의 역할을 수행하기 위한 하나의 목적을 위해 데이터와 기능들을 묶는 것 ex) Calculato.. 더보기
[Java] MyBatis #과 $의 차이 [Java] MyBatis #과 $의 차이 서론 약 2년 6개월 전 처음 취업을 하고 MyBatis를 사용해봤다. 데이터베이스에 접근하는 도구, 정도로만 인식을 하고 딱히 알아볼 생각을 안 했었다. 데이터베이스를 공부하겠다고 해도 오라클이나 SQL만 생각했었다. 약 6개월 전 처음 이직 면접을 봤는데, 생각도 못한 질문이 나왔다. MyBatis에서 #이랑 $의 차이가 뭐에요? 사실 회사에서는 바인딩을 할 때 #만 사용했었지, $를 본 적이 없어서 전혀 고민해본 적이 없었다. 면접이 끝나고 알아봐야지 하는 생각만 하고, 면접이 끝나고 알아보지 않았다. 그리고 약 한 달 뒤, 다른 기업의 면접을 보게 되었다. 첫 면접의 경험을 바탕으로 이전보단 질문에 잘 대답했었던 것 같다. 그러던 중 아차, 똑같은 질문이.. 더보기
[Java] String의 equals()와 hashcode() [Java] String의 equals()와 hashcode() String 생성 방법 1. 리터럴 String a = "12345; 2. new 연산자 String b = new String("12345); 리터럴과 new 연산자 방식의 차이 리터럴로 생성된 객체는 String Constant Pool 영역에 존재 리터럴은 내부적으로 String의 intern() 메소드를 호출. intern()은 해당 문자열이 String Constant Pool에서 검색 후 주소값 반환 또는 생성 new 연산자로 생성된 객체는 Heap 영역에 존재한다. equals()와 ==의 차이 .equals()는 값 비교, ==은 주소값을 비교한다. hashCode 각 객체의 주소값을 변환하여 생성한 고유의 주소값 .equal.. 더보기
[Java] JVM Garbage Collector [Java] JVM Garbage Collector JVM, 자바 가상 머신이란? Java Virtual Machine 운영체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램 메모리 관리, Garbage Collector 수행 GC, Garbage Collector란? 동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지 및 해제 하는 기능 Stack 정적으로 할당한 메모리 영역 primative 타입의 데이터가 값과 함께 할당 Heap 영역에 생성된 Object 타입의 데이터의 참조 값 할당 Heap 동적으로 할당한 메모리 영역 모든 Object 타입의 데이터가 할당 Heap 영역의 Object를 가리키는 참조 변수가 Stack에 할당 GC 프로세스 MARK Stack의 모든 변수를 스캔하면.. 더보기