[아이튠즈] 아이폰이나 터치보다 중요한거~

요즘은 RSS를 거의 보지 않는다. 피드 관리를 잘못해서;; 언제 한번 초기화 하고 다시 모아야 하는데 귀찮아서 안하고 있다. @_@;

애니웨이, 아이튠즈 U는 대단하다. 예일, 하버드, 스탠포드 등 유명 대학의 강의들이 제공된다. 특히 요즘 보고 있는건 스탠포드에서 강의했던 아이폰 개발 강의다. 애플 직원이 나와서 학생들한테 강의를 한다. 그리고 그걸 무료로 아이튠즈를 통해서 볼 수 있다. 그뿐인가, 다운도 받을 수 있고, Podcast로 등록되고, 귀찮으면 자동으로 동기화 시켜 아이폰이나 터치에 넣고 다닐 수 있다. 인코딩 따윈 필요없다. 이미 되어 있는 걸 제공하니깐.

한국의 대학들은 등록금 올리기만하고 발전하는 기미가 보이지 않는다. 고대생과 서울대 용자들을 보면 발전은 커녕 오히려 퇴보하고 있는 것 같기도 하다. 시대에 필요한 인재를 만들어 내려면 시대에 맞는 수업과 시대에 맞는 수단으로 학습을 꾀하는게 좋치 않을까? 어쩌면 한국의 대학들은 인재를 만들고 싶은게 아니라 돈을 만들고 싶어하기 때문에 그런 발전이 없는 걸지도 모르겠다.

힘들게 번 돈, 수준 낮은 대학 강의 들으려고 등록금(졸업까지 약 4천만원)으로 날리지 말고, 그냥 200배 싼 아이폰이나 터치(약 20만원)를 사자. 응?!!

[ASM] 클래스 – 구조

참조: http://download.fr.forge.objectweb.org/asm/asm-guide.pdf

컴파일 된 클래스 구성요소
– 클래스의 접근자, 이름, 상위 클래스, 인터페이스, 애노테이션
– 클래스에 선언한 필드당 한 섹션. 각 섹션에는 필드의 접근자, 이름, 타입, 애노테이션
– 클래스의 메서드와 생성자 당 한 섹션. 각 섹션에는 접근자, 이름, 반환 타입, 매개변수 타입, 애노테이션, 컴파일된(바이트) 코드

소스와 컴파일된 클래스와 차이
– 컴파일된 클래스는 오직 한 클래스에 대한 정보만 나타내지만 소스는 여러 클래스 가질 수 있다.
– 컴파일된 클래스는 주석을 가지고 있지 않다. 하지만 애노테이션에 부가 정보를 담을 수 있다. 그 전에는 클래스, 메서드, 필드, 코드의 attibutes 속성에 부가 정보를 전달했지만 이젠 별로 쓸 일 없다.
– 컴파일된 클래스는 package나 import 섹션이 없다. 모든 타입 이름이 전체 경로를 가지고 있다.
– 컴파일된 클래스는 constatnt pool 섹션을 가지고 있다.

internal name
– 클래스 또는 인터페이스 타입의 이름
– String -> java/lang/String

Type descriptor
– 자바 타입 서술자

boolean->  Z
char-> C
byte-> B
short-> S
int-> I
float-> F
long-> J
double-> D
Object-> Ljava/lang/Object;
int[]-> [I
Object[][]-> [[Ljava/lang/Object;

Method descriptor
– 메서드 서술자

void m(int I, float F) -> (IF)V
int m(Object o) -> (Ljava/lang/Object;)I
int[] m(int i, String s) -> (ILjava/lang/String;)[I
Object m(int[] i) -> ([I)Ljava/lang/Object;

KSUG 제10회 한국 스프링 사용자 모임 세미나

저도 발표자로 참석합니다.
봄싹에서 사용한 스프링 코드를 보여드릴 예정입니다.
설명만 하면 지겨우실테니,  스프링을 사용하여 어떤 간단한 서비스를 구현하는 모습도 보여드릴까 합니다.
많이 참석해 주세요~

EJ2E Item 24. unchecked 경고를 제거하자

참조: Effective Java 2nd Edition. Item 24: Eliminate unchecked warnings


Set<Lark> exaltation = new HashSet();

다음과 같은 코드는 컴파일 시 unchecked 경고를 발생시킨다. 

Set<Lark> exaltation = new HashSet<Lark>();

이렇게 수정하면 경고가 사라진다. 가능한 모든 unchecked 경고를 없애자. 모든 경고를 제거했다면 코드의 타입 안전성을 확보하는 것이다. 즉 실행시에 ClassCastException을 보지 않을 것이다.

만약 경고를 없앨 수 없지만 타입 안전성을 확신한다면 @SupressWarnings(“unchecked”) 애노테이션을 사용하여 경고를 무시할 수 있다.

SupressWarning 애노테이션을 사용할 때는 항상 최소 단위에 적용하도록 하자. 만약 클래스위에 붙여버리면 @_@.. 메서드에 붙여도 @_@. 메서드 내부에 코드가 많다면 그 중 어디선가 또 다른 타입 안전성 문제가 발생할 수 있다. 메서드 내부에 변수를 만들고 해당 변수에다가 붙이자. 단 한 줄짜리 메서드라면 뭐.. 

SupressWarning 애노테이션을 사용할 때마다 왜 타입 안전성이 보장되는지 주석을 달아두도록 하자. 그래야 다른 사람들도 이해할 수 있다.

요약: 경고는 중요하다. 무시하지 말자. 모든 unchecked 경고는 잠재적으로 런타임시의 ClassCastException에 해당한다. 이 경고들을 없애는데 주력하자. 만약 없앨 수 없지만 타입 안전성을 확신한다면 가장 최소한의 규모에 @SuppressWarning(“unchecked”) 애노테이션을 붙이자. 그리고 그렇게 결정한 이유를 주석으로 남기자.
 

[ActionScript 3.0] 클래스

public class Shape
{
    var visible:Boolean = true;
}
true 값을 가지고 있는 visible이라는 Boolean 타입 변수를 가지고 있는 Shape 클래스.
// ActionScript 2.0
class flash.display.BitmapData {}
// ActionScript 3.0
package flash.display
{
public class BitmapData {}
}
3.0 부터는 package문을 사용하기 때문에 클래스 이름에 패키지 이름을 선언할 필요 없다.
클래스 속성(class attributes)
dynamic: 실행 중에 인스턴스에 추가적인 속성을 추가할 수 있다.
final: 다른 클래스가 확장할 수 없다.
internal(default): 같은 패키지에서만 참조할 수 있다.
public: 모든 곳에서 참조할 수 있다.
생략하면 internal 사용.
클래스 본문
변수, 상수, 메서드 등을 정의할 수 있다. 
function hello():String
{
    trace(“hola”);
}
class SampleClass
{
    hello();
    trace(“class created”);
}
3.0 부터는 명령문도 포함시킬 수 있다.
class StaticTest
{
static var message:String = “static variable”;
var message:String = “instance variable”;
}
// In your script
var myST:StaticTest = new StaticTest();
trace(StaticTest.message); // output: static variable
trace(myST.message); // output: instance variable
3.0 부터는 static 변수와 인스턴스 변수 이름가 같은 이름을 사용할 수 있다.
클래스 프로퍼티 속성(class property attributes)
클래스의 프로퍼티들이 가질 수 있는 속성
internal(default): 같은 패키지에서만 참조 가능
private: 같은 클래스 내부에에서만 참조 가능
protected: 같은 클래스와 상속 받는 클래스에서 참조 가능.
public: 어디서나 참조 가능
static: 해당 프로퍼티가 클래스에 속한다는 것을 명시.
사용자 정의 네임스페이스: 사용자가 정의한 커스텀 네임스페이스
2.0에서는 private으로 해놔도 실행 중에 []를 사용해서 접근할 수 있는데. 3.0부터는 안 됨. 대신 클래스가 dynamic으로 선언되어 있으면 접근은 되지만 undefined가 반한됨.
static 특성
상송되지 않음. 
클래스 범위에 속함. 
인스턴스가 아니라 클래스 이름으로 접근해야 함.
사용자 정의 네임스페이스
패스 나중에 자세히
변수
var 또는 const를 사용하여 선언할 수 있다.
const 키워드로 선언한 것을 상수라고 한다.
정적 변수
class StaticVars
{
public static var totalCount:int = 0;
public static const MAX_NUM:uint = 16;
}
var또는 const와 static을 추가하여 선언한다.
클래스의 인스턴스가 아니라 클래스에 연결된다.
외부에서는 반드시 클래스 이름으로 접근해야 한다. 인스턴스로 접근하면 에러 난다.
선언할 때 초기화 해야한다. 안그러면 에러난다.
인스턴스 변수
static 키워드 없이 var 또는 const로 선언한 것.
인스턴스 마다 고유한 값을 가진다.
하위 클래스에서 재정의 할 수 없다. getter나 setter를 재정의하면 된다.
메서드
클래스 정의에 포함되는 함수.
function이라는 키워드로 정의한다.
함수 명령문으로 함수 정의
public function sampleFunction():String {}
함수 표현식으로 함수 정의
public var sampleFunction:Function = function () {}
함수 명령문 사용하는 이유
– 간결하고 쉽게 읽을 수 있다.
– override나 final 키워드 사용가능
생성자 메서드
클래스 이름과 같은 이름을 가진 함수
new 키워드로 해당 클래스의 인스턴스를 만들 떄 사용한다.
class Example
{
public var status:String;
public function Example()
{
status = “initialized”;
}
}
var myExample:Example = new Example();
trace(myExample.status); // output: initialized
생성자에는 public만 사용가능. 생략하면 기본으로 public. 사용자 정의 네임스페이스도 사용 못함.
super()를 사용하여 상위 클래스의 생성자를 명시적으로 호출 가능.
super()를 명시적으로 호출하지 않으면 자동으로 제일 먼저 호출해줌.
return 문을 사용할 수는 없지만 값을 반환하지는 못한다.
정적 메서드
static 키워드로 선언한 메서드.
인스턴스가 아니라 클래스에 연결된다.
인스턴스 메서드
static 키워드 없이 선언한 메서드
getter와 settter 메서드
class GetSet
{
    private var privateProperty:String;
    public function get publicAccess():String
    {
        return privateProperty;
    }
    public function set publicAccess(setValue:String):void
    {
        privateProperty = setValue;
    }
}
getXXX, setXXX 라는 이름을 사용하지 않아도 된다.
var myGetSet:GetSet = new GetSet();
trace(myGetSet.publicAccess); // output: null
myGetSet.publicAccess = “hello”;
trace(myGetSet.publicAccess); // output: hello
이렇게 사용할 수 있다.
바운드 메서드(메서드 클로저)
함수의 인자로 전달되는 메서드
함수의 반환값으로 전달되는 메서드
바운드 메서드 내부에서 this는 해당 메서드를 구현하는 인스턴스에 연결된다.
함수 클로저의 this는 호출 시점에 함수와 연결된 객체를 가리킨다. 이게 차이점이다.
class ThisTest {
    private var num:Number=3;
    function foo():void // bound method defined
    {
        trace(“foo’s this: ” + this);
        trace(“num: ” + num);
    }
    function bar():Function
    {
        return foo; // bound method returned
    }
}
var myTest:ThisTest = new ThisTest();
var myFunc:Function = myTest.bar();
trace(this); 
// output: [object global]
myFunc();
/* output: 
foo’s this: [object ThisTest]
output: num: 3 */
myFunc()는 바운드 메서드라 this가 여전히 자신이 속한 원래 인스턴스를 가리키고 있다.
클래스와 enum
enum을 지원하는게 딱히 없음.
그냥 java 5 이전처럼 static const 사용해서 정의.
public final class Day
{
public static const MONDAY:Day = new Day();
public static const TUESDAY:Day = new Day();
public static const WEDNESDAY:Day = new Day();
public static const THURSDAY:Day = new Day();
public static const FRIDAY:Day = new Day();
public static const SATURDAY:Day = new Day();
public static const SUNDAY:Day = new Day();
}

[#M_더보기|접기|

_M#]