JAVA 20(2) Math 클래스
·
Programming/Java
Math 클래스는 final 클래스 이기 때문에 상속이 불가능하다. Math 클래스는 생성자는 private 접근 제한자로 선언되어 있어 인스턴스를 생성할 수 없고, 맴버 변수와 메소드는 모두 static으로 선언되어 있다. 난수의 생성 import java.util.Random; public class Test { public static void main(String[] args) { Random rnd = new Random(); for (int i = 0; i < 5; i++) { System.out.println(rnd.nextInt(100)); } } } //output: //71 //60 //10 //64 //53 문자열의 토큰 구분 구분자로 나눠진 덩어리= 토큰 import java.uti..
JAVA 20(1) wrapper 클래스
·
Programming/Java
래퍼(wrapper) 클래스 기본 자료형 값을 인스턴스로 포장해주는 클래스 Boxing 기본 자료형 값->wrapper 인스턴스 Unboxing wrapper 인스턴스->기본 자료형 값 박싱과 언박싱의 예 래퍼 인스턴스는 immutable하다. 따라서, 값을 수정할 때마다 새 인스턴스를 생성해서 참조한다. Auto Boxing과 Auto Unboxing 컴파일러에 의해 자동으로 래퍼 클래스 변환시켜준다. 대입 연산자와 사칙 연산자를 통해 자동으로 박싱/언박싱 해준다. 오토 박싱도 마찬가지로 래퍼 클래스는 immutable하기 때문에 새 인스턴스를 생성한다. Number 클래스 Integer num1= Integer.valueOf(5); Integer num2= new Integer(5); Integer ..
JAVA 19(5) 얕은 복사와 깊은 복사
·
Programming/Java
shallow copy 위의 예제에서 cpy는 clone() 호출에 의해 org가 참조하는 인스턴스를 복사한 새 인스턴스를 참조한다. 인스턴스 복사에 의해 org와 cpy 멤버변수 값도 같다. 위의 예제에서는 org와 cpy가 참조하는 Point 객체도 같을 것이다. 독립된 메모리를 갖는 인스턴스가 복사 됐지만, 멤버변수가 참조하는 객체는 복사되지 않았다. 이러한 복사를 얕은 복사(shallow copy)라 한다. 멤버까지 독립된 메모리를 갖는 복사를 하려면 어떻게 해야할까? deep copy 멤버까지 독립된 메모리를 가질 수 있게 clone()을 수정한다.
JAVA 19(4) clone 메소드
·
Programming/Java
clone() Object 클래스에 정의된 메소드이다. 호출되면 인스턴스 복사가 이뤄진다. 단, Cloneable 인터페이스를 구현해야지만 clone 메소드 호출을 허용한다. 주의! clone()의 주인은 Object지 Clonable이 아니다. 착각하지 않도록 주의하자. 오버라이딩한 clone에는 특별한 기능은 없다. Object의 clone 메소드를 반환할 뿐이다. 하지만 오버라이딩을 통해 접근 수준을 protected에서 public으로 넓혀줌으로써 외부 접근이 가능해졌다. 참고로 Object의 clone의 접근 수준은 protected이다. 이처럼 접근 수준을 넓힐 수 있지만, public에서 protected으로 접근 수준을 좁히는 것은 허용하지 않는다. 참고! protected 선언은 패키지가..
JAVA 19(3) equals 메소드
·
Programming/Java
equals() - 인스턴스 비교 메소드 - '=='는 참조값을 비교한다(동일한 인스턴스를 참조하는지 비교한다). equals도 마찬가지로 참조값을 비교한다. - 같다는 기준은 프로그래머가 결정한다. 따라서, 상황에 따라 오버라이딩을 통해 equals를 재정의한다. String 클래스는 문자배열을 비교하기 위해서 이미 equals()를 오버라이딩하고 있다. ==는 참조하는 대상(인스턴스)을 비교하는 연산자이므로 위의 예제에서는 false을 반환한다. equals는 문자열 내용을 비교하도록 재정의 됐으므로 true을 반환하다. 따라서, 참조값을 비교할 때는 ==, 내용을 비교할 때는 equals를 호출하면 된다.
JAVA 19(2) Object 클래스
·
Programming/Java
finalize 메소드 프로그래머가 호출하는 메소드가 아니다. 인스턴스 소멸 시 자동으로 호출된다. GC(가비지 컬렉션)는 자주 해줘야 할까? GC을 자주하면 프로그램 실행 속도가 느려지기 때문에 자주 GC하지 않는다. GC의 2단계 1. JVM이 힙을 스캔하면서 GC 대상의 인스턴스들을 확인한다. 2. 확인 후, JVM은 인스턴스를 바로 소멸시키지 않고, 잠시 프로그램에 CPU할당을 양보한다. 여유가 생기면 체크한 인스턴스들을 소멸시킨다. 주의! finalize 메소드는 GC의 2단계에서 호출된다. GC하는 이유는? GC는 프로그램을 지속적으로 운영하기 위해서 반드시 필요하다. 프로그램이 동작하는데 메모리 공간이 없으면 안되기 때문에 힙이라는 메모리 공간을 여유가 있을 때마다 비워주는 것이다. fina..
JAVA 19(1) 메모리 모델
·
Programming/Java
자바의 메모리 모델 운영체제 관점에서 JVM도 하나의 프로그램이다. 운영체제 입장에서 자바 프로그램과 JVM 둘 다 메모리 공간을 할당해야 한다. 따라서, 자바 프로그램이 2개 실행되면, JVM도 2개 실행된다. 하나의 JVM은 하나의 자바 프로그램을 실행시킨다. JVM은 메모리 공간 활용의 효율성을 높이기 위해 메모리 공간을 3개의 영역으로 구분한다. 메소드 영역 - 메소드 바이트 코드(.java -> .class), static 변수를 저장한다. - 한번 저장(기록)하면 프로그램이 종료될 때까지 유지가 된다. 스택 영역 - 지역변수, 매개변수 - 이 영역에 저장된 변수는 해당 변수가 선언된 메소드 종료 시 소멸된다. 힙 영역 - 인스턴스 힙과 스택을 구분하는 이유는? 한 인스턴스 X를 두 참조변수 x..
JAVA 18(2) 예외 클래스 Throwable
·
Programming/Java
Throwable 클래스 모든 예외 클래스의 최상위 클래스이다. 물론 Object를 상속한다. getMessage(): 예외의 원인을 담고 있는 문자열 반환 printStackTrace(): 예외가 발생한 위치와 호출된 메소드의 정보를 출력 참고! 각각를 출력할 필요는 없다. printStackTrace()는 원인도 알려준다. 예외 (책임)전달 예외가 발생하면 JVM은 실행을 멈추고 예외 처리 메커니즘 루틴이 실행된다. 그 과정에서 제일 먼저 예외가 왜 발생했는지 파악하고 그와 관련된 클래스의 인스턴스를 생성하는 것이 기본적인 단계이다. 예외 처리 메커니즘의 첫 번째 단계라고 할 수 있겠다. 두 번째, 예외가 발생하면 try를 찾는다. 예외 발생 지점에서 예외를 처리하지 않으면(try문을 찾지 못하면) ..
JAVA 18(1) 예외처리의 기본
·
Programming/Java
예외처리의 기본 프로그래머의 실수가 아니라 사용자의 실수가 예외다. 즉, 사용자가 기대하지 못했던 상황을 예외라고 한다. 그러한 예외 상황을 프로그래머의 처리를 예외처리라고 한다. 예외 상황을 알리기 위한 클래스 java.lang.ArithmeticException 수학 연산에서의 오류 상황을 의미하는 예외 클래스 java.util.InputMismatchExecption 클래스 Scanner를 통한 값의 입력에서의 오류 상황을 의미하는 예외 클래스 위 2가지 클래스는 내가 직접 생성하려는 클래스가 아니라, JVM이 특정 예외 상황을 알리기 위해 정의한 클래스이다. try~catch 예외의 처리를 위한 코드를 별도로 구분하기 위해 디자인된 예외처리 알고리즘이다. try블록에는 예외가 발생할 수 있는 코드..
JAVA 17(3) 인터페이스의 static 메소드
·
Programming/Java
인터페이스도 클래스처럼 static 메소드 정의할 수 있고, 호출 시에도 클래스와 호출 방법이 같다. prn1 instanceof Printable //prn1이 참조하는 인스턴스를 Printable 형 참조변수가 참조할 수 있느냐? 즉, prn1이 참조하는 인스턴스가 인터페이스Printable을 구현하고 있느냐? 마커 인터페이스는 클래스에 특정 표시를 해 두기 위한 목적으로 정의된 인터페이스이다. 마커 인터페이스는 구현해야 할 메소드가 없는 경우가 흔하다. 위의 예에서 만약 doc instanceof Upper가 true 라면, 그 의미는 인스턴스가 Upper의 구현체를 가지고 있다는 의미일 것이다. 하지만 Upper은 마커 인터페이스로서 추상 메소드 자체가 없다. 따라서 인스턴스는 Upper가 imp..