Language/Java

Language/Java

좋은 객체? 나쁜 객체?

추상화 추상화란 중요한 것은 남기고, 불필요한 것은 제거하는 것이다. 즉, 먼 미래까지 대비해서 클래스를 만들 필요는 없다. 예를들어, 고객 클래스를 만든다면, 이름, 성별, 나이가 필요하다면 그것만 가지도록 하고, 기능도 필요한 것만 가지도록 한다. 캡슐화 관련된 것을 잘 모아서 가지고 있는 것을 캡슐화라고 한다. 관련된 것을 잘 모아서 가지고 있을수록 응집도가 높다고 표현한다. 예를들어, Math라는 이름만 기억하면 수학과 관련된 기능이 필요할때 Math를 사용하면 되겠구나하는 점이 캡슐화가 잘된 것이다. 좋은 객체? 나쁜 객체? 자바는 객체 지향 프로그래밍 언어이고, 클래스가 설계도라면 이 클래스가 인스턴스가 되어 메모리에 올라갔을때 이 것을 객체라고 한다. 이때, 좋은 객체는 응집도는 높고, 결합..

Language/Java

자바 버전별 메모리 영역과 인스턴스 생성

Java 8 이상부터는 Metaspace가 사용된다. 여기에 클래스 정보가 올라간다. 여기서 Java Heap은 JVM이 관리하는 메모리 영역이고, Native Memory는 운영체제가 관리하는 메모리 영역이다. 클래스 파일 정보 자체는 정적이다. 하지만 동적인 것들은 실행되면서 생성되는 것들을 말한다. 따라서 JVM은 사용해야할 클래스의 정보를 읽어들여서 메모리에 올리게 된다. 왜냐하면, 클래스가 저장된 보조 기억장치는 RAM보다 속도가 느려 매번 이곳에서 읽어들이는 것은 성능을 저하시키기 때문이다. 결론적으로 클래스 정보는 처음 사용될 때 메모리에 그 정보를 올리고, 필요할 때마다 사용하게 된다. 예를들어, Person p1 = new Person(); Person p2 = new Person(); ..

Language/Java

클래스 메서드에서 인스턴스를 필드를 사용하지 못하는 이유

static 메서드 내에서는 instance 필드나, instance 메서드를 사용할 수 없다. 그 이유는 메모리에 생성되는 시점이 다르기 때문이다. 클래스 메서드는 인스턴스가 없어도 사용이 가능하지만, 인스턴스 필드는 인스턴스가 있어야만 사용이 가능하기 때문이다. 즉, 클래스 메서드가 실행되는 시점에서는 인스턴스 필드가 메모리에 없기때문에 사용할 수 없다고 컴파일 오류가 발생한다. 또한 클래스 필드는 아래와 같이 static 블록에서 초기화할 수 있다. static int count; static { count = 100; } main method보다 먼저 실행되는 static 블록 .java 소스를 컴파일하고 java로 실행을 하게되면, JVM은 CLASSPATH에서 해당 클래스 파일을 찾는다. 이 ..

Language/Java

클래스 필드(static field)에 대한 고찰

Person p1 = new Person();은 Person instance를 생성한다. 그런데 instance를 만들기전에 JVM이 하는 일이 있다. JVM은 Person 클래스가 CLASSPATH에 있는지 찾아보고, 클래스를 찾을 수 없으면 ClassNotFoundException을 발생시킨다. 여기서 PersonTest 클래스를 실행하게 되면, Person 클래스를 차게 되고, 찾으면 Person 클래스 정보를 메모리에 올리게 된다. 이때, 클래스 정보 자체는 정적이라고 말한다. 왜냐하면, 클래스 정보 자체는 실행되는 것이 아니기 때문이다. 즉, SSD에 저장되어 있던 클래스를 읽어들여서 자바가 사용할 수 있는 메모리 영역에 그 정보를 올리게 된다. 이때, 클래스에 static 필드가 있는지 살펴보..

Language/Java

CLASS METHOD vs INSTANCE METHOD

static method는 객체 생성이나 유틸리티 관련에서 사용될 때가 있다. 되도록 instance method를 사용한다.

Language/Java

Math클래스 API

자바 API 자바 API란 자바 개발자가 제공하는 명령어를 말한다. API 문서란 이런 명령어들의 사용법과 규격을 제공하는 문서이다. 생성자의 접근 제한자 생성자의 접근 제한자가 private하다는 것은 instance 생성을 못하게 한다는 의미이다. 그렇게 instance를 생성하지 못하면 instance method들은 사용할 수 없게되고, static이 붙은 클래스 메서드만 사용이 가능하게 된다. Math 클래스 Math 클래스를 만든 사람은 여러 개의 instance를 생성하지 못하게 함으로써 메모리를 절약할 수 있도록 하고, Math.method() 형식으로 쉽게 호출하도록 만들었다.

Language/Java

JVM의 CLASSPATH 옵션

자바 소스는 javac 명령을 통해 컴파일된다. (javac VendingMachine.java) 컴파일 후 실행할 때, main 메서드를 가진 클래스를 실행한다. (java VendingMachineMain). 즉, JVM 이 VendingMachineMain을 실행해주게 된다. 그렇다면 JVM은 VendingMachineMain을 어디서 찾아서 실행할까? 즉, 정리해서 질문하면, javac를 이용해 compile을 하면, 소스 파일이 있던 곳에 class파일이 생성된다. 그렇다면 java VendingMachineMain이라고 실행하면 JVM은 어디서 찾을까? JVM이 클래스를 실행하려면, 일단 클래스를 찾아야 한다. 이 때, JVM이 VendingMachineMain 클래스를 java가 실행되는 경..

Language/Java

자바 컴파일 과정

자바는 JVM덕분에 OS에 독립적인 특성을 가지고 있다. 그럼 JVM의 어떤 기능 때문에 OS에 독립적으로 실행시킬 수 있는지 자바 컴파일 과정을 알아보자. 자바 컴파일 순서 개발자가 Java Source (.java)를 작성한다. Java Compiler가 Java Source 파일을 읽어 byte code (.class)로 컴파일한다. 여기서 byte code는 JVM이 읽을 수 있는 코드이다. 컴파일된 byte code를 JVM의 Class Loader에게 전달한다. Class Loader는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 Runtime Data Area의 Method Area. 즉, JVM의 메모리에 올린다. Execution Engine은 JVM 메모리에 올라온 byte c..

Language/Java

오버플로우 (overflow)

계산 결과가 최댓값을 넘거나 최솟값보다 작을 경우, 음수는 양수로, 음수로 바뀌는 문제가 발생하는데 이를 오버플로우라고 한다. 1byte가 표현할 수 있는 가장 큰 값은 01111111이다. 여기에 1을 더하면 10000000이 된다. 즉, 부호 비트가 1인 음수가 되게되는데, 이 값을 구하기 위해 -1하고 보수를 취해주면 10000000이 된다. 따라서 10진수로 표현하면 -128이 되는 것이다. 정리하면 1byte로 표현할 수 있는 가장 큰 값은 127이고, 127에 1을 더하면 -128이 된다. 이 현상을 오버플로우라고 한다. 타입의 변환: 자바 강제 형 변환의 문제점 long이 가질 수 있는 가장 큰 값을 2진수로 표현하면, 01111111 11111111 11111111 11111111 1111..

Language/Java

각 타입별 값의 범위

리터럴 값인 숫자 5는 int타입이다. 리터럴 값인 숫자 5L은 long타입이다. byte 크기: 1바이트 값의 범위: -2^(8-1) ~ 2^(8-1)-1 short 크기: 2바이트 값의 범위: -2^(16-1) ~ 2^(16-1)-1 int 크기: 4바이트 값의 범위: -2^(32-1) ~ 2^(32-1)-1 long 크기: 8바이트 값의 범위: -2^(64-1) ~ 2^(64-1)-1 float타입은 4byte 크기의 실수 값을 가질 수 있다. 리터럴 값인 숫자 5.2f는 float 타입이다. double타입은 8byte 크기의 실수 값을 가질 수 있다. 리터럴 값인 숫자 5.2는 double이다. float 크기: 4바이트 값의 범위: (3.4 X 10^-38) ~ (3.4 X 10^38) 지수의..

kimjingyu
'Language/Java' 카테고리의 글 목록 (3 Page)