JAVA 필요한 나만의 정리
# 상수 선언
final int num = 10;
num = 30 (X) => "final"로 선언한 수는 상수이므로 일반 변수처럼 사용이 불가해서 변환이 되지 않는다.
# 접근제어자 (access modifier)
-변수, 메서드에게 접근할 수 있는 속성을 붙일 수 있다.
- class는 public/ default만 가능
- 종류
1. private : class 밖에서는 사용 금지
2. default : 접근제어자가 없는 상태/ 해당 package내에서만 사용가능
3. protected : 같은 package내에서 사용가능, package가 다를 경우 상속상태라면 해당 요소(변수,메소드) 사용가능.
4. public : 한 프로젝트 영역까지 공개
# 예외처리 (exception handling)
try{
에러가 발생할 만한 코드;
}catch(에러클래스명 e){
에러 발생 시 보여주고 싶은 내용;
}finally{
생략가능
에러 발생 여부와 무관하게 무조건 실행해야할 코드;
}
NullpointerException : 값이 null인 상황에서 처리하려 할 때 발생
ArithmeticException : 0으로 나누려 할 때 발행
FileNotFoundException : 파일이 없을 때 발생
ArrayIndexOutofBounsExceptio : 배열의 요소 범위를 초과했을 때 발생
- 프로그램 오류의 종류
1. 컴파일 에러
: 자바의 문법적 오류로 컴파일 되지 않는 구문상의 오류
2. 런타임 에러
: 실행 시 발생하는 에러
3. 논리적 에러
: 예를 들어 게임 프로그래밍에서 비행기가 총알을 맞아도 죽지 않음(논리적으로 이해할 수 없는 상황,
but 코드상의 문제가 없는 경우라서 오류를 찾기가 힘들다.)
- 참조 메서드 만드는 방법
/**
* @이런형식으로 메서드 위에 작성해주면 다른 개발자가 내가 작성한 메서드를 참조할때 hot to use형식을 볼 수 있다(F2를 누르면 보이는 메모장 형식의 정보)
* @author 이상은
* @param num
* @return num의 값
*/
public void something(){...}
- (String name = "dd";) (String name = new String("dd");) 차이점!
String n1 = "dd" 와 String n2 = "dd"는 같다.
String n1 = new String("dd") 와 String n2 = new String("dd")는 다르다.
이유 : 생성자 없이 같은 값을 선언한 변수는, 이미 존재하는 값이라면 존재하는 값의 주소를 참조한다. (주소를 공유)
생성자를 통해 선언한 변수는, 공유없이 바로 새로운 공간을 받아 값을 넣는다. (+ String 변수의 주소를 출력은 hashcode메서드 사용)
- String class는 immutable, StringBuffer class는 mutable!
String n1 = "dd", 추후에 n1 = "hello"로 변경한경우에는
"dd" 주소에 "hello"으로 변환하는게 아니라 "hello"를 위한 새로운 공간을 만든다. 즉, "dd"가 "hello"로 바뀌는것이 아니고
n1이 "dd"를 가리키는 선을 끊고 새로 생긴 "hello"에 연결이 생긴다. => 메모리 낭비 ; 그래서 필요한 StringBuffer class!
- Calendar cal = Calendar.getInstance(); => 싱글 패턴
- extends와 implement!
1) extends는 일반 클래스와 abstract 클래스 상속에 사용
2) implement는 interface 상속에 사용
** 여기서 abstract 클래스와 interface의 차이점 (공통점은 prototype만 있고 body가 없는 메소드를 멤버함수로 가진다)
*** abstract 클래스는 일반 메소드와 혼용해서 사용가능하지만 interface는 모든 메소드들이 abstract 메소드로 존재 해야한다.
*** 일반클래스가 포함되었다면 다중상속이 불가하지만 interface의 경우 다중상속이 가능하다.
*** 결국 큰 범주에서 본다면 abstract method로만 이루어진 abstract class가 interface인 셈