안드로이드 스튜디오 - 코틀린과 자바 차이(1)

Jang Seok Woo·2021년 7월 20일
0

실무

목록 보기
64/136

자바로 작성된 CameraActivity 부분을 코틀린으로 새로 작성하게 되어 2가지 코드를 분석해보고 공부해보는 시간을 갖도록 하겠다.

가장 먼저 눈에 띄는 부분은 상속부분

자바는 extends와 implements로 상속이 구분이 된다.

extends

부모에서 선언 / 정의를 모두하며 자식은 메소드 / 변수를 그대로 사용할 수 있음

implements (interface 구현)

부모 객체는 선언만 하며 정의(내용)은 자식에서 오버라이딩 (재정의) 해서 사용해야함

abstract

extends와 interface 혼합. extends하되 몇 개는 추상 메소드로 구현되어 있음

위와 같이 자바에서는 두 가지 상속 방법에 있어 확실한 구분을 하고 사용하게 되나, 코틀린에서는 그냥 : 뒤에 나열함으로써 딱히 구분하지 않고 사용한다.

자바

코틀린

코드를 비교해보면 다른점이 하나 더 있다.

클래스의 public이 표기되어 있지 않는데, 코틀린에서는 public은 기본으로 여겨져서 생략이 가능하다. 생략되면 public이구나 하고 인지하게 된다.

변수 선언에 있어 차이점

val/var

val

val로 지정된 불변 타입 변수는 초기에 값을 할당되면 나중에 값을 변경할 수 없으며 값을 변경하게 되면 컴파일 에러가 발생합니다.
즉, 값을 초기화만 가능하고 변경은 불가합니다.
Java에서는 final과 같다고 볼수있습니다.
val은 한번만 초기화 되며 값을 변경할 수 없지만 컴파일러가 코드 문맥을 확인시 val 변수가 한번만 초기화 되는것이 맞다면 개발자가 상황에 따라 val를 여러 값으로 초기화(할당) 할 수 있습니다.
val은 초기화 후 값을 변경이 불가능한 것이 맞습니다.
하지만 변수의 참조가 가리키는 객체의 내부 값은 변경이 가능합니다.

fun main(args: Array<String>){
  // 1. val : value의 약어이며 변경 불가능(immutable)한 변수, 초기화만 가능
  val name = "Kotlin"
  //1-1. 위에서 이미 값이 할당 되었기 때문에 아래 코드처럼 값 할당 불가
  name = "Java"
  
  //2. 타입 지정 가능, 다만 1번처럼 컴파일러에서 타입이 추론 가능한 경우 생략 가능
  val name2: String = "Swift"
  //2-1. 초기화시 값을 할당하지 않을시엔 반드시 타입을 지정해야함
  val name2: String
  name2 = "Swift"
  
  //3. 코드 문맥에 따라 val 변수가 1번만 초기화 되는것이 맞다면 여러 값을 초기화(할당) 가능
  val name3: String 
  
  if (isSuccess()){ 
    name3 = "Anroid" 
  }else{ 
    name3 = "iOS"
  }
  println("name3 : $name3")
  
  //4. 변수의 참조가 가리키는 객체의 내부 값은 변경이 가능
  val nameArray = arrayListOf("Kotlin")
  nameArray.add("Java")
  println("nameArray : $nameArray")
}

var

var로 지정된 가변 타입 변수는 초기화 후 값을 변경이 가능합니다.
하지만, 다른 타입의 값을 넣을 수는 없습니다.
처음에 String 타입으로 초기화를 한뒤 Int 타입의 값을 넣을수는 없습니다.
그렇다고 해당 변수를 뒤에서 Int 타입으로 재정의 한다면 타입 미스매치(Type mismatch) Error가 발생합니다.
이미 정의된 타입을 변경하려면 자바와 같이 형변환을 해야합니다.

fun main(args: Array<String>){
  //1. 초기화 후 값 변경 가능
  var name1 = "kotlin" 
  name1 = "java"
  println("name1 : $name1") //출력 : java
  
  //2. 초기화 시 타입을 지정 했다면 다른 타입의 값을 넣는 것은 불가능
  var name2 = "kotlin" 
  name2 = 77 //Type mismatch 에러 발생
}

?

한가지 더 타입 선언시 뒤에 물음표를 붙인다.

자바

    private String mCameraId;
    private CameraDevice cameraDevice;
    private CameraCaptureSession cameraCaptureSessions;
    private CaptureRequest captureRequest;
    private CaptureRequest.Builder captureRequestBuilder;
    private Size imageDimension;

코틀린

    private var mCameraId: String? = null
    private var cameraDevice: CameraDevice? = null
    private var cameraCaptureSessions: CameraCaptureSession? = null
    private var captureRequestBuilder: CaptureRequest.Builder? = null
    private var imageDimension: Size? = null

코틀린에서 기본적으로 인자는 null을 가질 수 없으며, 가지게 하려면 타입에 위와 같이 ?를 붙이면 된다.

물음표를 꼭 붙이지는 않아도 되며, 해당 물음표의 의미는 nullable이라는 의미를 갖는다.

!!

느낌표 두개는 위의 물음표과는 다르게
null값이 절대로 들어오면 안됨을 뜻한다.

profile
https://github.com/jsw4215

0개의 댓글