목록분류 전체보기 (109)
나의 지식 보관소
final 필드는 한번 초기값이 저장되면 그 값을 프로그램 실행도중에 변경할수 없다. final 필드에게 초기값을 주는 방법에는 두가지가 있는데, 하나는 필드 선언시에 주는것이고, 다른 하나는 생성자에게 주는 것이다. 단순값이라면 선언시에 주는것이 제일 간단하고, 복잡한 코드가 필요하거나 외부데이터로 초기화해야 한다면 생성자에서 초기값을 지정해야한다. final과은 언뜻 상수처럼 보이지만 final을 상수라고 부르지는 않는다. 상수는 불변의 값이고 불변의 값은 객체마다 저장할 필요가 없는 공용성을 띤다. 즉 상수는 static이면서 final이다
전체 프로그램에서 단 하나의 객체를 만들도록 하는것을 싱글톤 패턴이라고 부른다. 단 하나의 객체만을 만들기 위해서 외부에서의 생성자 호출을 막기위해 생성자에 private 접근 제한자를 붙여준다. 그리고 클래스 내부에 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화 한다. 정적 필드도 private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하도록 막는다. 대신 외부에서 호출할수있는 정적메서드인 getInstance()를 선언하고 참조하고 있는 자신의 객체를 리턴해준다. public class 클래스명 { private staitc 클래스명 singleton = new 클래스명(); private 클래스명() { } static 클래스명 getInstance() { return..
정적 필드는 보통 선언과 동시에 초기화를 해주지만, 계산이 필요한 초기화 작업일 경우에 생성자에서 초기화를 해주어야 한다. 하지만 보통의 인스턴스 생성 시에 호출되는 생성자의 경우 객체 생성 시에만 실행되기 때문에 객체 생성 없이도 사용해야 하는 정적 필드의 초기화에 알맞지 않다. 그래서 자바는 정적 블록( static block )을 제공한다. static { //초기화코드 } 정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행되며, 클래스 내부에 여러 개가 선언될 시에는 선언된 순서대로 실행된다. 정적 블록의 사용시에 주의할 것은 정적 블록 내에서 인스턴스 필드나 인스턴스 메서드 그리고 this 키워드를 사용할 수 없다. 이는 정적 블록이 객체 없이도 실행할 수 있기 때문이다. 이러한 점은 정적 ..
가변 인자는 자바에서 메서드를 호출할 때 매개변수의 개수를 동적으로 지정할 수 있게 하는 방법이다. int Sum(int ... values){ int sum = 0; for(int i=0;i
은닉성 객체지향에는 크게 세 가지 특성이 있다. 그중 하나가 은닉성이라고 부르는 것인데, 은닉성은 사용자에게 필요한 최소한의 기능만을 노출하고 다른 것을 내부에 숨기는 것을 뜻한다. 즉 선풍기를 예로 들면 선풍기 날개의 분당 회전수 같은 사용자에게 불필요한 정보는 들어내지 않고 강풍, 약풍, 미풍, 정지와 같은 필요한 기능만을 노출하는 것이다. 프로퍼티 우리가 코드를 작성하다 보면 필드를 public으로 선언하고 싶을 때가 있다. 모든 것을 public으로 선언해버리면 외부에서 특별한 메서드의 도움 없이 '='를 이용해서 필드를 사용할 수 있고, 어떤 것을 private로 하고 public을 할지 생각할 필요도 없으니 귀찮음과 수고로움이 확 줄어든다. 하지만 은닉성에 좋지 않다. 그렇다면 은닉성을 지키면..
아래와 같은 포인터를 void형 포인터라고 부른다. void *ptr void형 포인터에는 어떠한 주소값이든 담을 수 있다. 하지만 어떤 포인터 연산도 하지 못한다. 심지어 참조도 불가능하다.
함수 또한 변수처럼 메모리공간에 저장되는데, 함수포인터 변수는 이런 메모리상에 저장된 함수 주소 값을 저장하는 포인터변수를 말한다. 또한 배열의 이름이 배열의 시작지점 주소를 가리키듯이 함수의 이름은 함수가 저장된 메모리 공간의 주소 값을 의미한다. 그렇다면 함수이름의 포인터형은 어떤 기준으로 결정될까? 우리가 함수를 사용할때는 매개변수와 반환형 그리고 어떤 일을 하는지만 알면된다. 그마저도 함수가 어떤 일을 하는지 몰라도 작동은 가능하다. 즉 매개변수와 반환형 이 두가지 포인터형을 결정짓는다. 그러니 함수의 포인터 변수의 선언은 아래와 같이 하면된다. int (*funPtr) (float) //funPtr은 float형 매개변수 하나를 받고 int형을 반환하는 함수 포인터 매개 변수가 두개이상이면 다음..
2차원 배열의 이름이 가리키는 것은 2차원 배열 int arr2d[3][3]; 가 있다고 가정해보자. 배열의 이름인 arr2d가 가리키는 것은 첫 번째 요소의 주소이다. 또한 arr2d[0], arr2d[1], arr2d[2]은 각각 1행 2행 3행의 첫 번째 요소를 가리킨다. 그렇다면 arr2d와 arr2d[0]은 같은 것일까? 지닌 주소 값 자체는 같다. 하지만 arr2d와 arr2d[0]에 각각 sizeof연산을 해보면 arr2d는 36을 반환하는 것에 반해 arr2d[0]는 12를 반환한다. 즉 배열 이름인 arr2d는 배열 전체의 크기를 반환하였고 arr2d[0]은 1행의 크기를 반환한 것이다. 따라서 2차원 배열의 이름인 arr2d는 첫 번째 요소를 가리키면서 배열 전체를 의미하지만, arr2..