2016년 9월 25일 일요일

JAWIFT generics_2

우선 작명에 대한 변명부터 해야 겠다.(스스로 위로함 || self defense)

C & JAVA 를 CIVA 라고 했는데 JAVA & SWIFT 를 JAWIFT 라고 하니 되게 경망스럽고 수준이 낮아 보인다.(뭐 눈엔 뭐만 보인다라고 해도 벗어날 수 없는 굴레)
0xC8 노마 아니고요. 참고로 이 분은 파고다 중국어 강사님.

평등을 뜻하는 로고가 뭐로 보이냐는 메갈리아(여성혐오 반대 및 남성혐오 사이트)의 말도 이해가 되며, 좋아하는 작가 하일권이 왜 스퍼맨을 그리면서 음지에 있는 성교육을 밖으로 끌어내려 하는지 이해도 하기에.
이런 작명을 하였다. 어차피 영어고 미국인이 보면 그냥 그러려니 할테니.

generics 설명은 간단하다. generics 는 반복되는 코드양을 줄이기 위해 만들었다.

public SomeClass {

처럼 지정할 수 있다.  자주 쓰는 ArrayList 도 generics가 적용되어 있다.

ArrayList mArray = new ArrayList();

하면 String 형으로,

ArrayList mArray = new ArrayList();

로 하면 Integer 형으로 할 수 있다. generics가 없다면 각 자료형에 따른 class를 따로 만들어줘야 한다. 매소드도 마찬가지.

public void myMethod(SomeClass pArray) {        

로 선언하면 어떤 Array도 받을 수 있다. 단 myClass를extends 한 녀석이라야 한다. extends Object 면 extends 를 없앤 것과 같은 개념. ? 대신 T를 써도 되는데 내부에 T로 쓸 일이 없으면 그냥 ? 쓴다.

public SomeClass {
    T a;

라고 하면 T에 따라 자료형을 바꿀 수 있다. 안 쓴 사람은 있어도 한번만 쓰는 사람은 없다는 generics 는 JAVA에서 꼭 필요한 개념이다. 수년 전 기업에서 generics로만 바꿔서 코드양을 많이 줄였다. 상용 프로그램은 코드양이 많고, 상속관계가 복잡해서 정리하기 힘들고 귀찮은 과정이었다. 이 개념 하나로 꽤 좋은 평을 들었으니 참 고마운 개념이고, 사실 이제 모르면 안되는 개념이다. C++ 에서는 템플릿이라고 하고, 오늘 설명할 SWIFT에서는 똑같이 generics 라고 한다.(다행이다)


설명은 여기 있다.

스위프트 알고리즘 클럽의 리니어 서치 소스로 설명하면, 다음과 같다. JAVA와 내용 구성은 다를게 없다. 인자를 JAVA 처럼 적기 위해 두번째 인자에 _ 를 붙여주고, 리턴 자료형을 뒤에 -> 로 적어주며, nil 리턴을 안전하게 하기 위해 ? 클로저를 쓰는 부분만 빼고는.

func linearSearch(array: [T], _ object: T) -> Int? {
    for (index, obj) in array.enumerate() where obj == object {
        return index
    }
    return nil
}

let array = [5, 2, 4, 7]
linearSearch(array, 2)
linearSearch(array, 4)

extends는 C++의 상속 개념과 같은 : 이다. function 을 쓸 때 보면 JAVA와 같이 따로 명시하지 않고 바로 쓴다. equatable 은 ==, !=로 비교 가능한 프로토콜을 말한다. 프로토콜은 자바의 인터페이스와 같은 개념이다.


class 로 만들어 보자.

class LinearSearch {
    internal var array = Array()
    internal var object : T?

    init() { }
    init(_ x: Array, _ y: T) {
        self.array = x
        self.object = y
    }

    func linearSearch() -> Int? {
        for (index, obj) in array.enumerate() where obj == object {
            return index
        }
        return nil
    }
}

let array = [5, 2, 4, 7]
var ls = LinearSearch(array, 2)

var ls2 = LinearSearch()
ls2.array = array
ls2.object = 4

print(ls.linearSearch()!)
print(ls2.linearSearch()!)

JAVA 와 다른점이 없다는 것을 표현하기 위해 변형하였다. 별 다른 차이점이 보이지 않는다. (참고로 internal 접근 제한자는 default 와 비슷한 녀석이라 보면 되겠다)

print 에서 object 가 찾을 수 없는 수 일 때는 nil 이 return 되는데 결국 if 문을 써줘야 한다. 내 생각에는 보다 나은 프로그래밍 언어가 나온다면, 클로저보다는 널 발생 했을 때 한곳에서 모든 리스트를 표현해 주고 카테고리화 해주어서 일괄 핸들링 할 수 있는 핸들링 클래스를 자동 생성해 주고 디버깅이 쉬운 언어가 나오는 것이 더 낫겠다는 생각이 든다.

개발하다보면 버그 종류는 2500 가지가 넘어가고 크리티컬 버그만해도 80가지 정도 되는데 가장 중요한 버그는 딱 2가지다. null 상황이 와서 reset이 나던가, 무한루프에 빠져서 프로그램이 멈춘 것처럼 보이던가. 이 두가지 버그를 일으키는 것은 전자의 경우 resource leak 혹은 overflow 와 같이 메모리 문제를 일으키는 경우다. 후자의 경우는 논리적으로 잘못짠 경우가 많다. 둘 다 찾기 어려울 때는 JAVA의 경우 Exception 이 쌓여서 결국 ERROR를 일으키는 경우다. try catch 로 에러를 막는다고 해서 문제 상황 직전의 모든 context를 복구하지는 못하기 때문이다. - 이 6줄은(데탑기준) 3년 이상 경력 개발자라야 알 수 있다.(그래서 사람 뽑을 때 1, 3, 5, 7, 9로 나눈다. 1년은 기본 코딩 능력, 3년은 디버깅 능력, 7은 설계 능력, 9는 설계 및 팀 리딩 능력... 그 위로는 그냥 관리자... -밤샘이 힘드므로-)

늘 그렇듯이 블락 단위로 깔끔하게 설명해야 하는데 나누어서 깔끔하게 적기는 시간이 없고. 경험을 많이 나누기 위해 샛길이 더 많다는 것은 내가 글을 쓰면서도 아쉽다.

자바 개발자던 스위프트 개발자던 서로 존중해 주는 문화를 만들려면 서로의 언어가 큰 차이점이 없다는 것을 알리기 위함이 핵심이니.

CPU와 메모리의 장난, 혹은 마법인 프로그래밍... 조금 지겨워 진다.

양자 컴퓨터가 어서 집 안으로 오면 좋겠다.

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...