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..
JAVA 17(2) 인터페이스의 기본 접근 지정자
·
Programming/Java
인터페이스의 추상 메소드는 public이다. 접근 지시자를 표시하지 않아도 인터페이스만은 default가 아닌 public으로 인식한다. 인터페이스에 인스턴스 변수를 선언할 수 없다. 따라서 접근 지시자 없이 변수가 선언됐다면 그 것은 인스턴스 변수가 아니라 상수(public static final인 이유)이다. 인터페이스가 상속이 필요한 이유 만약 기존 인터페이스에 새로운 메소드를 추가한다면 어떤 문제가 발생할까? 예제에서는 컬러 출력 메소드가 인터페이스에 추가되었다. 삼성 프린터에서 컬러 출력 메소드가 필요 없어도 이미 인터페이스에는 메소드가 추가 됐으므로 컬러 출력 메소드를 귀찮더라도 구현해야 한다. 왜냐하면 인터페이스 구현하는 클래스는 해당 인터페이스의 모든 추상 메소드를 구현해야 되기 때문이다...
JAVA 17(1) 인터페이스
·
Programming/Java
프로그래밍에서 말하는 인터페이스 인터페이스= 통신방법 도구/수단 인터페이스를 정의할 때 메소드는 몸체를 갖지 않는다. 이런 메소드를 추상 메소드라고 한다. 인터페이스는 클래스가 아니기 때문에 인스턴스를 생성할 수 없다. implements 키워드를 통해 클래스에서 인터페이스는 구현될 뿐이다. 인터페이스형 참조변수는 인터페이스를 구현한 클래스의 인스턴스를 참조 할 수 있다. 인터페이스는 메소드 구현체가 없으므로 메소드 오버라이딩한 것은 아니지만, 메소드의 호출 관계에서는 오버라이딩 관계가 성립한다. 따라서, @Override을 쓸 수 있다. 만약 Printer에 print메소드 뿐만 아니라 수 많은 메소드가 존재하고, 개발자는 print 추상 메소드를 제공하는 Printable인터페이스를 만들었다고 가정하..
JAVA 16 상속이 도움 되는 상황
·
Programming/Java
상속 기반이 아닌 코드의 문제점 위의 코드는 상속을 사용하지 않은 코드이다. 인맥 관리 프로그램은 기본적으로 저장/확인 기능이 구현되어야 할 것이다. 두 클래스의 멤버 변수/메소드가 서로 다르므로 저장/확인 구현도 각각 구현해야 할 것이다. 하지만 이러한 클래스 디자인 기반해서 관리 대상이 늘어난다면 그 만큼 코드 수도 늘어나 복잡해질 것이다. 상속 기반의 문제 해결 ComFriend와 UnivFriend은 분명 다른 클래스지만, Friend가 두 클래스를 상속하게 만듦으로 인해 두 클래스에 공톡적인 규칙과 규약을 적용하게 된다. 여기서 말하는 규칙과 규약은 상위클래스(Friend)이다. 상위클래스 참조변수로 각각의 하위클래스 인스턴스를 참조한 상황이다. 보시다시피 배열이 하나니까 저장하는 방법도 하나로..
JAVA 15 오버라이딩
·
Programming/Java
상속을 위한 두 클래스의 관계 하위 클래스는 상위 클래스의 모든 특성(변수, 메소드)을 지닌다. 상속 관계에 있는 두 대상은 IS-A 관계를 가져야 한다. IS-A관계란 A is a B의 관계로, A는 일종의 B라는 의미를 가진다. 예를 들어 "사과는 일종의 과일이다"처럼 실제 관계를 가진 대상끼리 상속(extends) 해야 한다. 만약 코드 상 지우개라는 클래스가 노트북이라는 클래스에 상속(extends)됐다고 가정해보면, 문법적으로 오류는 없지만 IS-A관계가 성립하지 않으므로 상속을 사용하면 안된다. IS-A 관계는 상속을 위한 일종의 규칙이다. 메소드 오버라이딩 상위 클래스 참조변수(ph2)는 하위 클래스 인스턴스(SmartPhone)을 참조 가능하지만, 하위 클래스의 변수/메소드에 접근할 수 없..