W.A 저장소

서울대학교 교육 1일차. 본문

Programing

서울대학교 교육 1일차.

W.A 2010. 8. 10. 00:17

오늘 아침부터 일찍 일어나서(6시쯤) 서울대학교 앱창작터에서 첫 안드로이드 교육을 받기 시작하였다. 모 내가 안드로이드에 대해서 그렇게 많은 관심이 있었던것은 아니지만 저번 학기 프로젝트실무를 진행하면서 급 관심이 생겼기에 이번에 서울대학교 앱창작터에서 하는 교육을 지원하여 듣게 되었던것이다. 처음 기대반 근심반(너무 멀었기에.)으로 서울대로 향하였다. 오랜만에 아침에 하루를 바삐살아가는 사람들을 보며 나도 정말 이제는 좀 열심히 살아야겠다는 결심을 가지고 음악을 들으며 책을 읽으며 서울대까지 왔다. 처음 시작은 서울대학교 앱창작터 센터장이신 이상구교수님이 간단하게 인사말과 현 IT의 동향에 대해서 설명해주셨다.

오전 일정은 기초적인 자바에서 부터 자바의 아주 중요한 3요소 등을 배웠다. 모 대부분 아는 내용들이었지만 순수하게 자바만을 만져본것도 참 오랜만이라서 모 이리저리 조금은 헷깔리기도 했다. 그래도 모 그럭저럭 못 들을 만한 내용은 아니었다. 하지만 그래도 지금까지 그냥 수박 겉핧기 식으로 알고 있던 내용이 좀 탄탄해지는 듯한 느낌을 받았다. 그중에서 하나 생각나는걸 여기에 써보도록 하겠다.

먼저 우리가 그동안 객체를 생성하거나 할때에는 일반적으로 아래와 같은 식으로 코딩을 한다.

 
Circle c = new Circle();
c.draw(idx);
 
Circle draw(int idx) {
return this;
}
 Circle c = new Circle();
draw(c, idx);

Circle draw(Circle this, int idx) {
            return this;
}
하지만 중요한 점은 컴파일러에서 인식할 때에는 사용자가 따로 오른쪽과 같이 사용하지 않아도 오른쪽과 같은 형식으로 인식을 한다는 점이다. 위 오른쪽과 같은 this를 우리는 히든포인터라고 부른다.

this는 메소드 내에서만 사용 가능하며 메소드가 속하는 객체의 참조값을 가지고 있는것이 된다.

밑과 같은 소스를 보자.
class Circle {
private double radius = 0;

public Circle setRadius( double radius ) {
this.radius = radius;
return this;
}

public double getArea() {
return Math.PI * radius * radius;
}

public Circlee display() {
System.out.println( "Area of circle with radius " + radius + " = " + getArea() );
return this;
}
}

class ThisTest {
public static void main( String[] args ) {
Circle circle1 = new Circle();
(((circle1.setRadius(3)).display()).setRadius(5)).display(); // 1번
circle1.setRadius(3).display().setRadius(5).display(); //
2번
}
}

지금 빨간색으로 표시한 부분을 해석하면은 먼저 왼쪽부터 circle1이라는 레퍼런스 변수로 인스턴스화된 Circle객체에 setRadius라는 메서드를 사용하여 반지름을 세팅하고 this를 리턴함으로서 1번에서 제일 왼쪽편은 circle1.setRadius(3) 이것의 의미는 반지름이 3으로 세팅이된 상태로 하여 객체 자신이 반환이 됨(setRadius메서드의 return this로)으로 그 다음으로 바로 연결이 되어서 사용이 가능하다.

this는 객체가 메모리를 할당받기 전에는 사용가능하지가 않다.

다음은 클래스 내의 메서드나 지역변수 전역변수가 저장되는 위치를 한번 알아보자.
메모리의 종류는 메서드영역 / 힙 영역 / 스택 영역 이렇게 3가지로 나뉘어 진다.

 메서드 영역 힙 영역  스택 영역 
 바이트코드 사용자가 할당한 메모리   지역변수 
 젼역변수    함수의 인자
     함수의 리턴값
     리턴 번지
또한 추가적으로 static으로 선언한 전역변수와 메서드도 메서드영역에 만들어진다.

클래스 초기화의 순서는

클래스가 메모리에 적제 -> 모든 클래스 변수가 디폴트 값으로 초기화 -> 클래스 변수 초기화 수식 -> 클래스 초기화 블럭

여기서 내가 생소했던 부분이 클래스 초기화 블럭인데 클래스 초기화 블럭을 사용하는 때는 아래와 같이 들수 있다.
  • 클래스 변수 초기화 수식만으로 부족할 때
  • 배열 클래스 변수를 초기화할 때
  • 여러 개의 클래스 변수를 한번에 초기화할 때
  • 예외(exception)을 발생시키는 메서드를 호출할 필요가 있을 때

이렇게 4가지로 나뉘게 된다. 사용하는 방법은 아래 코드에서 볼 수 있다.

class StaticInit {
public static int face[] = new int[10];

static {
facs[0] = 1;
for(int i = 1; i < 10; ++i)
facs[i] = facs[i-1] * i;

System.out.println("클래스 초기화 블럭 실행됨");
}

public static void main(String args[]) {
new StaticInit();
}
}

final 변수는 C에서 들자면은 상수와 같은 것이다. final로 선언을 한 변수라면 한번 변수에 값이 할당이 되었다면 절대 바뀔수 없는것이다. 할당이 되지 않는 상태로 final로 선언만 되어 있는 상태라면 딱 한번만 final변수에 값이 할당 될 수 있다.



오늘은 여기까지다. 오후시간에는 열심히 실습하고 빨리 끝나면은 보내주더라. 내일 조낸 빨리 끝내고 언능 가야겠다.

'Programing' 카테고리의 다른 글

서울대학교 교육 2일차. #2  (0) 2010.08.11
서울대학교 교육 2일차.  (0) 2010.08.10
Android User Interface를 쉽게 만들자!!(DroidDraw)  (0) 2010.08.07
1 Day : Layout을 정복해 볼까?  (0) 2010.08.07
선택자.  (0) 2010.08.07