JVM JVM은 자바 가상머신으로 자바 바이트코드를 실행 할 수 있는 주체로 JVM 덕분에 CPU나 운영체제(플랫폼)과 독릭접으로 동작 가능하다 JVM은 크게 Class Loader,GC, Runtime Data Area, Excute engine 세가지로 나뉜다 Class Loader 자바 컴파일러가 .java 파일을 컴파일하면 .class 파일(바이트 코드)가 생성된다. 이렇게 생성된 클래스 파일들을 엮어 Runtime Data Area 형태로 메모리에 적재하는 역할을 한다. Execution Engine 메모리에 적재된
이 글은 원서와 친해지기 위해 JavaWorld의 Java 101: The essential Java language features tour, Part 1 중 일부를 정리한 글입니다. 이 시리즈의 첫번째는 assertions 과 generic에 대한 것이다. Assertions in Java 1.4 Java 1.4에 소개 된 Assertion은 유용하고 중요한 에디션이다. Assertion은 프로그램이 올바르게 동작하거나 동작하지 않는 요구사항을 코드화하는데 사용된다. condition을 테스트하여, false가 나오게 되면 개발자에게 알려준다. assertions을 사용하는 것은 코드가 올바르게 동작하는지에 대한 확신을 준다. Assertions은 버그가 발생한 시점에서 어디서 버그가 발생했는지 알려주도록 사용 할 수 있다. > Assert는 예약어이며
본 내용 은 필자가 작성한 글이 아니라 이글 을 퍼온 글입니다. 추상클래스 추상클래스는 추상메서드(abstract method)가 없어도 무방하다. 추상클래스와 인터페이스의 차이점에서 키워드는 목적이다. 추상클래스의 목적은 말 그대로 공통적인 기능을 하는 객체들의 추상화다. 예제들을 보면 사자 클래스, 원숭이 클래스, 고래 클래스 같은 구체적인 클래스가 있고, 추상클래스로 공통기능을 가진 동물 클래스를 만드는 것이 나온다. 이번 포스트에서는 동물 클래스 대신 포유류 클래스를 만들었다고 가정하자. 위키백과에 따르면 포유류는 젖먹이 동물이라고 한다. 즉, 젖을 먹이는 공통적인 기능을 가지고 있고, 각 포유류에 속하는 동물인 사자, 원숭이, 고래에게 중복으로 구현할 필요가 없다. 그래서 추상 클래스인 포유류 클래스를 만드는 것이다. 처음에 말했듯 추상클래스에 “젖을 먹인다” 라는 행위
String 객체 살펴보기 위 코드는 java.lang의 포함된 String 클래스이다. 내부적으로 final char 와 int hash를 필드로 가지고 있다. 문자열은 char 배열에 관리되고 있음을 알 수 있다. 그러나 한 가지 주목해야 될 점은 char 배열이 final로 선언되어 있음이다. 내부 value가 final로 선언되어 있기때문에 String 객체는 Immutable하다. 아래 코드를 살펴보자 url은 초기에 "http://"로 선언되어 있다. 이후 객체에 저장된 값이 변경되면 내부에 가지고 있는 value값을 변경하는 것이 아니라 "http://naver.com"의 값을 가지는 String 객체를 새로 생성한다. 그렇다면 기존의 "http://" 객체는 어떻게 되는 것일까? 참조를 잃어버려 더 이상 접근 할 수 없는 객체(Garbage)가 되어 GC의 대상이 된다. 이러한 이유로 문자열 연산이 많은 경우에는 성능이 좋지 않다.
Java Collections Framework(JCF) Java에서 Collection이란 데이터의 집합, 그룹을 의미한다. JCF는 이러한 데이터, 자료구조인 Collection 인터페이스와 구현체를 제공한다. 아래 사진은 Java 컬렉션 프레임워크의 상속 구조를 나타낸다. 배열과 비슷하지만 크기에 제한이 없다는 장점이 있다. 스크린샷 2019-11-11 오후 4.48.20.png List와 Set, Queue 인터페이스는 모두 Collection 인터페이스를 상속받지만, 구조상의 차이로 인해 Map 인터페이스는 별도로 정의되어 있다. 각 인터페이스를 살펴보자 Set > 순서가 중요하지 않고 데이터의 중복을 허용하지 않는다. HashSet : 가장
얼마 전 N사 전화면접에서 GC에 대한 질문을 받고 그대로 얼어버린 경험이 있다. GC에대해 들어본 적은 있으나 동작원리나 관련 내용들을 제대로 몰라 할 수 있는 말이 없었다. 그래서 이번 포스팅에 대해 GC에 대해 정리해보기로 했다 가비지 콜렉터(Garbage Collector)란? 가비지 콜렉터를 알아보기 전에, 여기서 말하는 가비지가 무엇인지부터 알아보자. 가비지는 '정리되지 않은 메모리', '유효하지 않은 메모리 주소'를 말한다. 다음 코드를 통해 살펴보자 위 코드에서 String 배열이 할당되기 전에 할당한 0과 1은 어디로 갔을까? 이렇게 주소를 잃어버려서 사용할 수 없는 메모리가 '정리되지 않은 메모리'이다. 프로그래밍 언어에서는 Danling Object, 자바에서는 Garbage라고 부른다. 추가로 앞으로 사용하지 않고 메모리를 가지고 있는 객체 역시 Garbage에 포함된다. 가비지는 메모리가 부족할 때 이런 가비지들을 메모리
생성자 대신 정적 팩토리 메서드를 고려하라 생성자와 비교하여 정적 팩토리 메서드가 가지는 장점은 아래와 같다. 이름을 가질 수 있다. 호출 될 때마다 인스턴스를 새로 생성하지 않아도 된다. 반환 타입의 하위 타입 객체를 반환 할 수 있다. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환 할 수 있다. 정적 팩토리 메서드를 작성하는 시점에는 반활할 객체의 클래스가 존재하지 않아도 된다. 하나씩 살펴보도록하자. 이름을 가질 수 있다. 여러개의 생성자를 가지는 경우에도 생성자에는 이름을 부여할 수 없다. 단지 입력 매개변수에 따라 그에 해당하는 생성자가 맵핑될 뿐이다. 반면 정적 팩토리 메소드는 이름을 가질 수 있기에 보다 명확하고 반환될 객체의 특성을 쉽게 묘사 할 수 있다. 예를 들어 값이 소수인 BigInteger를 반환하는 객체를 만든다고 가정할 때 **BigInteger(int, int, Random) 과 BingInteger
First Class Citizon First Class Citizon는 아래와 같은 속성들을 모두 만족해야 한다. 변수에 값을 할당 할 수 있어야 한다. 함수의 파라미터로 넘겨줄 수 있어야 한다. 함수의 반환값이 될 수 있어야 한다. Java에 method는 위 조건 모두를 만족하지 않음으로 Java에서 method는 일급객체가 아니고 때문에 java는 함수형 프로그래밍 언어가 아니다 Java8에서는 함수를 일급객체처럼 다룰 수 있게 함수형 인터페이스를 제공한다. 함수형 인터페이스란 단 하나의 추상 메소드만 가지는 인터페이스를 의미한다.(static함수는 여러 개 가질 수 있다.) 함수형 인터페이스를 이용함으로서 객체를 선언하고 오버라이딩하고... 이런 노이즈들을 없애고 단순히 람다식 함수를 통해 코드를 간결하게 작성 할 수 있다. 계산기 if - else 문없이 구현하기
Stream API 란 Java 8에서 새롭게 추가된 Api로 함수형 인터페이스(람다식)을 적용하여 컬렉션과 같은 저장요소를 반복적으로 처리할 수 있는 기능이다. java에서 완전한 Funtional Programming은 아닐지라도 비슷하게 흉내라도 낼 수 있게 도와준다. Stream Api는 다음과 같은 특성을 가진다. Stream은 Immutable 하다. 다시 말해 원본의 데이터를 변경하지 않는다. Stream의 연산은 layz 하다. 즉 필요 할 때만 연산함으로 효율적인 처리가 가능하다. Stream은 재사용이 불가능하다. Stream API를 사용함으로서 얻는 이점은 코드의 가독성이 높아지고, 실수의 여지를 줄여준다. 아래의 예제를 살펴보자. 단순히 주어진 배열중 3~9사이의 숫자 중 두배했을 때 10이 넘는 첫번째 인자를 찾는 코드이다 코드가 나타내는 로직이 한눈에 들어오지 않고, if문과 여러 변수들