목록프로그래밍 언어 (11)
일모도원(日暮途遠) 개발자
아래와 같은 코드를 처음 봤을때 맨 마지막의 ()가 뭔지 궁금했었다. 결론부터 말하면 함수를 실행할때 함수명 다음에 ()를 붙이는거와 같다. 즉 함수를 실행하고 그 결과 값을 받는거다. 아래 코드에서 ()는 someValue에 {}의 내용을 실행하여 결과값을 할당(割當, assigne)하는 코드이다. 즉 15를 리턴해준다. (아래에서 설명할 함수명()와 동일하다. 함수를 실행시킬려면 함수명 뒤에 ()를 붙여야 하듯이) let someValue: Int = { return 5 + 10 }() print(someValue)를 하게 되면 15이 나온다. 만약 아래처럼 ()를 빼고 실행하면 어떻게 되나 확인해 봤다. let someValue: Int = { return 5 + 10 } someValue를 Int..
내부 클래스에서 외부 클래스의 메소드를 부를때는 그냥 메소드명으로 부르면 된다. 하지만 같은 이름의 메소드가 내부/외부에 같이 있을때는 그냥 메소드명으로 부르면 내부 클래스의 메소드가 호출된다. 외부 클래스의 메소드를 호출하기 위해서는 "외부클래스명.this.메소드명"으로 호출해야 한다. 즉 Outer.this.show() 이런씩으로 내부 클래스내에서 호출하면 외부 클래스인 Outer클래스의 show메소드가 호출된다. class Outer { void show() { System.out.println("outter show"); } class Inner{ void show() { System.out.println("inner show"); } void myMethod() { show(); //"inner..
빈배열을 만들때는 아래처럼 만든다. var array0 = [Int]() 하지만 [Int]를 좌변에 이렇게 넣으면 에러난다. var array00:[Int] = () // Cannot convert value of type '()' to specified type '[Int]' 배열을 만들때 값을 초기화 시켜줄려면 아래처럼 리터럴로 값을 주면 된다. var array3 = [1, 2, 3] var array31:[Int] = [1, 2, 3] 하지만 [Int]를 우변에 이렇게 넣으면 에러난다. var array31 = [Int][1, 2, 3] // Instance member 'subscript' cannot be used on type '[Int]' 배열을 만들때 같은 값이 여러번 반복되게 할려면 아..
Java SE는 Standard Edition을 말한다. 일반적으로 자바를 다운받을때는 이 스탠다드 에디션(SE)버전을 다운받는다. 자바가 처음 공개된 1994년 부터는 JDK뒤에 버전을 붙인 이름으로 부르다가 1998년에 발표된 J2SE 1.2부터 J2SE라고 이름을 지었다. J2SE 는 Java 2 Platform, Standard Edition라는 뜻이다. 2006년에 발표된 Java SE 6부터는 JAVA SE뒤에 버전을 붙이기 시작했다. SE는 Standard Edition이라는 뜻이다. 버전은 6이지만 내부적으로는 1.6이다. 2014년에 발표된 JAVA SE 8도 사람들은 1.8버전이라고도 많이 부른다. 2017년 발표된 JAVA SE 9부터는 더이상 "1."을 추가하지 않고 그냥 버전 9라..
스위프트에서 enum을 swtich문을 쓸때는 모든 케이스를 다 적어주는걸 권장하는거 같다. 일부 빠진 케이스가 있으면 아래처럼 "Switch must be exhaustive" 에러가 난다. 그래서 보통 이렇게 enum의 모든 케이스를 다 적어주던지 아님 이렇게 안적어준 부분을 default로 처리한다. 근데 분명히 모든 케이스들들 다 적어줬는데도 이런 요상한 경고가 뜨기 시작한다. 사용자가 만든 enum "Switch covers known cases, but 'AVAudioSession.RecordPermission' may have additional unknown values, possibly added in future versions" Switch문이 현재 이미 알려진 enum의 케이스들은 ..
자바 클래스에는 클래스 이름과 같은 이름을 가지는 생성자(生成者, Constructor)가 있고, 아무런 메소드 명이 없은 초기화 블럭(Initialize block)이 있다. 잘 쓰이지 않는 문법이지만 면접용으로 알아는 두자. 아래 초기화블럭은 인스턴스 초기화 블럭이다. 생성자와 다르게 아무런 이름이 없다. class Car { int speed; // 생성자 Car() { System.out.println("Speed of Car: " + speed); } // 초기화 블럭 (아무런 이름이 없다) { speed = 60; } public static void main(String[] args) { Car obj = new Car(); } } 다른 초기화 블럭으로는 스태틱 초기화 블럭이 있다. 차이는 ..
파일명이 "movie 9.mp4", "movie 10.mp4", "movie 11.mp4" 처럼 있다. 오름차순으로 정렬할려고 아래처럼 사용하니 files.sort(by: { $0.compare($1) == .orderedAscending } ) 결과가 "movie 10.mp4", ""movie 11.mp4", "movie 9.mp4"처럼 나왔다. 이는 "movie 1"과 "movie 9"가 비교되어서 그렇다. 이럴때는 compare대신 localizedStandardCompare를 쓰면 원하는 방식으로 정렬이 된다. files.sort(by: { $0.localizedStandardCompare($1) == .orderedAscending } ) "movie 9.mp4", "movie 10.mp4", ..
스위프트에는 ~= 라는 특이한 연산자가 있다. 범위 연산자(영어 이름은 Expression Pattern 인거 같다)라고도 하는데 특정 값이 어떤 범위에 있는지 여부를 알려준다. "범위 ~= 특정 값"의 형태로 사용하며 결과는 Bool값으로 반환 된다. 아래 예를 보면 0...10 ~= 5 는 5가 0~10사이에 있으므로 결과는 true이다. 0...10 ~= 20 은 20이 0~10사이에 없으므로 결과는 false이다. let arrayA = 0...10 let a = arrayA ~= 5 let b = arrayA ~= 10 let c = arrayA ~= 20 print("result a : \(a)") //true print("result b : \(b)") //true print("result ..