Programming/Java
JVM의 전체적인 구조를 그려보면 해당 그림과 같다. 클래스 로더 클래스 로더는 바이트 코드(.class)를 읽고 메모리의 적절한 위치에 저장한다. 클래스 로더의 구조를 좀 더 자세히 그려보면 다음과 같다. 클래스 로더는 크게 로딩, 링크, 초기화 순으로 진행이 된다. 각 과정들에 대하여 간단히 정리해보았다. 로딩 .class 파일을 읽고 적절한 바이너리 데이터를 만들고 메소드 영역에 저장을 한다. 이때 메소드 영역에 저장하는 데이터는 다음과 같다. FQCN (Fully Qualified Class Name) : 패키지명까지 포함되어 있는 식별자이다. Class, Interface, Enum의 종류 해당 클래스의 메소드와 변수 이러한 로딩 과정이 끝나면 해당 클래스 타입의 Class 객체(Class 의 ..
처음 자바를 접할때 JDK, JRE가 뭐가 다른지부터 헛갈렸던 기억이 있다. 이번 글에서 이러한 용어에 대한 차이를 알아보고자 한다. Java 자바는 프로그래밍 언어로 JDK에 들어있는 자바 컴파일러를 통해 .class(바이트 코드)파일로 컴파일 할 수 있다. 또한, JVM을 통해 Wirte Once Run Anywhere로 Java 언어 자체는 플랫폼에 독립적이다. java 바이트 코드 $ javap -c Hello.class Compiled from "Hello.java" public class Hello { public Hello(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public stat..
switch문 앞서 작성하였던 HonorGradingStrategy의 basicGradePointsFor 메서드는 switch문을 사용하여 아래와 같이 변경할 수 있다. private int basicGradePointsFor(Student.Grade grade) { switch (grade) { case A: return 4; case B: return 3; case C: return 2; case D: return 1; default: return 0; } } switch문에 인수로 주어지는 grade가 비교할 대상이 된다. 임의 개수의 case 레이블을 지정할 수 있다. 각 case와 일치할 경우 바로 뒤의 명령문을 실행하고 그렇지 않으면 생략된다. 일치하는 case가 없다면 default로 이동한..
모든 과목에 대한 보고서 앞서 RosterRepoter를 통해 과목을 신청한 학생들에 대한 보고서를 만들었다면 이번에는 모든 과목에 대한 보고서를 만들어본다. 우선, CourseReportTest를 만들어 보고서의 뼈대를 만들어준다. public class CourseReportTest extends TestCase { public void testReport() { final Date date = new Date(); CourseReport report = new CourseReport(); report.add(CourseSession.create("ENGL", "101", date)); report.add(CourseSession.create("CZEC", "200", date)); report.ad..
클래스 메소드 객체는 동작(메소드)과 속성(필드)으로 이루어지며 객체가 유지되는 동안 속성은 유지된다. 또한 객체는 항상 인스턴스 변수의 산태로 표현 가능한 특정 상태를 가진다. 객체는 메소드는 크게 동작 메소드(객체의 상태를 변경), 질의 메소드(객체 상태의 일부를 반환)로 나뉠 수 있으며 이와 같이 메소드는 한가지의 일만 하도록 디자인하는 것이 좋다. 간혹 인수를 받아서 그 인수에 대해서만 연산을 하고 값을 반환하는 메소드가 필요한 경우가 있다. 이러한 메소드를 유틸리티 메소드라고 하며, 객체의 상태에는 영향을 주지 않는다. 다른 언어에서는 함수(function)이라고 불리며 어떤 클라이언트에서든지 호출이 가능하다. 예로들면 앞서 DateUtil을 들 수 있다. 원래 코드와 아래 코드를 비교해보자. ..
문자와 문자열 문자 char 프리미티브(primitive)형 유니코드(Unicode 4.0) 표준에 기반 2Byte = 2^16 = 65,536개의 문자 표현 가능 본질적으로는 숫자 assertEquals('\u0041', 'A'); => 'A'를 '\u'와 16진수 '0041'(10진수로 65)로 표현 assertEquals('\101', 'A'); => 'A'를 '\'와 8진수로 표현 특수 문자 역슬래시(\)뒤에 문자를 넣은 이스케이프 시퀀스(escape sequence)로 특수 문자 표현 '\r' : 캐리지 리턴 (Carriage return) '\n..
CourseSession 강의의 기본 과목 정보와 수강정보를 관리하기 위해 CourseSession 클래스를 정의할 것이다. 단과대학, 수강번호, 학점 등의 기본적인 과목 정보는 일반적으로 학기마다 같다. 강의는 과목의 한가지 부분이며 다른 여러 정보와 강의 날짜와 강의하는 선생님의 정보, 강의에 수강신청한 학생의 목록을 가진다. CourseSession 클래스를 만들기 전에 테스트 케이스를 먼저 작성한다. public class CourseSessionTest extends TestCase { public void testCreate() { CourseSession session = new CourseSession("ENGL", "101"); assertEquals("ENGL", session.getD..
테스트하기 테스트 위주 개발 작성하는 모든 코드에 대하여 테스트를 만드는 것, 또한 작성 이전에 먼저 테스트를 작성하는 것이다. 이러한 테스트는 해야하는 작업을 명확히 하기 위한 도구로 사용된다. 각 클래스는 대응되는 테스트 클래스가 있다. 위 그림에서 StudentTest 는 결과 클래스 Student를 위한 테스트 클래스이다. 따라서 StudentTest는 Student 클래스 형식의 객체를 생성하고 생성한 객체로 메시지를 보내서 기대되는 동작을 수행하는지 확인한다. 위 UML의 화살표를 보면 알 수 있듯이 StudentTest 는 Student 에 종속적이다. 반대로 Student 는 StudentTest 에 종속적이지 않다. 따라서 작성하는 결과 클래스는 그 클래스를 위해 작성한 테스트에 영향을 ..
Lombok이란? Lombok은 Getter, Setter, ToString과 같은 메서드들을 간편하게 사용할 수 있게해주는 어노테이션기반 JAVA의 라이브러리입니다. 물론 IDE를 사용해 Getter, Setter 등의 메서드들을 손쉽게 생성할 수 있지만 멤버변수가 증가하면 증가할 수 록 코드의 양이 많아지고 복잡해지게 됩니다. Lombok은 이러한 것을 어노테이션을 이용해 개발자가 실제 구현한 코드에는 보이지 않지만 컴파일이 될 때 해당 메서드들이 자동으로 생성이 되는 과정을 통해 돌아가게 됩니다. Lombok 사용하기 의존성 추가 Spring Boot를 사용할 시 프로젝트 생성할 때 추가해도 되지만 그렇지 않다면 아래의 의존성을 추가해주어야한다. compileOnly 'org.projectl..