튼튼발자 개발 성장기🏋️

[Java와 비교하는 Kotlin] 기본 개념 #1 본문

프로그래밍/Kotlin

[Java와 비교하는 Kotlin] 기본 개념 #1

시뻘건 튼튼발자 2024. 11. 23. 15:47
반응형

1. 필드와 변수

Java에서 클래스의 필드는 반드시 명시적으로 선언된 타입과 함께 접근 제어자가 필요하다. 반면, Kotlin에서는 필드 선언이 더 간결하고 유연하다. Kotlin은 기본적으로 val(불변 변수)과 var(가변 변수)로 구분하며, var는 Java의 mutable 변수와 비슷하고, val은 Java의 final 변수와 유사하다.

Java code와 Kotlin code를 비교해보자.

  • val은 name처럼 불변(읽기 전용) 필드를 정의하며, var는 age처럼 가변 필드를 정의한다.
  • Kotlin에서는 getter와 setter를 자동으로 생성해준다. name은 val이기 때문에 setter가 없고, age는 var이므로 setter가 자동으로 생성된다.

 

public class Person {
    private String name;  // 필드 선언
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
}
class Person(val name: String, var age: Int)  // 필드 선언과 동시에 초기화

 

2. 클래스와 인터페이스

Java에서는 클래스와 인터페이스를 명시적으로 class와 interface 키워드를 사용하여 정의한다. Kotlin에서는 기본적으로 Java와 비슷하지만, 일부 문법이 간소화되었다. 또한, Kotlin에서는 interface를 abstract class로 구현할 수 있으며, 클래스 선언 시 open 키워드를 사용해야 상속할 수 있다. 즉, 기본적으로 상속을 할 수 없고 확장이 불가능하다는 이야기다.

Java code와 Kotlin code를 비교해보자.

 

  • Circle 클래스는 Drawable 인터페이스를 구현한다. Kotlin에서는 콜론(:)을 사용하여 구현할 인터페이스를 지정한다.
  • override 키워드는 메서드를 오버라이드할 때 사용다.

 

interface Drawable {
    void draw();
}

class Circle implements Drawable {
    @Override
    public void draw() {
        System.out.println("Circle drawn");
    }
}

// ...

class Animal {
    void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Dog barks");
    }
}
interface Drawable {
    fun draw()
}

class Circle : Drawable {
    override fun draw() {
        println("Circle drawn")
    }
}

// ...

open class Animal {  // open 키워드로 상속을 허용
    open fun sound() {  // open 키워드로 메서드 오버라이드를 허용
        println("Animal makes a sound")
    }
}

class Dog : Animal() {
    override fun sound() {
        println("Dog barks")
    }
}

 

3. 원시 타입이 없음

Java에서는 int, char, double 등의 원시 타입(primitive types)이 존재한다. 반면에 Kotlin에서는 원시 타입이 없고, 모든 데이터 타입은 객체로 취급된다. 예를 들어, Int, Double, Char는 Kotlin에서 클래스로 존재하며, Int는 java.lang.Integer와 유사하다.

Java code와 Kotlin code를 비교해보자.

  • Kotlin에서 Int, Double, Char 등은 모두 객체이고, 이를 통해 널 안전성(Null Safety)도 보다 효과적으로 처리할 수 있다.
int num = 10;
double price = 15.99;
char letter = 'A';
val num: Int = 10
val price: Double = 15.99
val letter: Char = 'A'

 

4. 컬렉션의 두 유형

Kotlin에서는 컬렉션을  변경 가능한(Mutable) 컬렉션과 변경 불가능한(Immutable) 컬렉션 두 가지 유형으로 구분한다. 이는 Java의 List, Set, Map과 유사하지만, Kotlin에서는 기본적으로 read-only 컬렉션이 제공된다.

Java code와 Kotlin code를 비교해보자.

 

  • Kotlin에서 val로 선언된 컬렉션은 변경 불가능(immutable)이고, var로 선언된 컬렉션은 변경 가능(mutable)이다.
  • listOf, setOf는 읽기 전용 컬렉션을 만들 때 사용하며, mutableListOf, mutableSetOf는 요소를 추가하거나 삭제할 수 있는 가변 컬렉션을 만다.

 

List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");

Set<String> uniqueNames = new HashSet<>();
uniqueNames.add("Alice");
uniqueNames.add("Bob");
fun main() {
    val names: List<String> = listOf("Alice", "Bob")  // Immutable List
    val uniqueNames: Set<String> = setOf("Alice", "Bob")  // Immutable Set

    println("Immutable List: $names")	// Immutable List: [Alice, Bob]
    println("Immutable Set: $uniqueNames")	// Immutable List: [Alice, Bob]

    // 컬렉션 수정: 컴파일 오류 ('add' cannot be called on a immutable list)
    names.add("Charlie")
    uniqueNames.add("Charlie")
    
    val mutableNames: MutableList<String> = mutableListOf("Alice", "Bob")  // Mutable List
    val mutableUniqueNames: MutableSet<String> = mutableSetOf("Alice", "Bob")  // Mutable Set

    println("Mutable List before modification: $mutableNames")	// Mutable List before modification: [Alice, Bob]
    println("Mutable Set before modification: $mutableUniqueNames")	// Mutable Set before modification: [Alice, Bob]

    // 컬렉션 수정
    mutableNames.add("Charlie")
    mutableUniqueNames.add("Charlie")

    // 수정된 컬렉션 출력
    println("Mutable List after modification: $mutableNames")	// Mutable List after modification: [Alice, Bob, Charlie]
    println("Mutable Set after modification: $mutableUniqueNames")	// Mutable Set after modification: [Alice, Bob, Charlie]
}
반응형

'프로그래밍 > Kotlin' 카테고리의 다른 글

리스트  (0) 2024.12.08
재귀와 공재귀  (0) 2024.12.07
함수 프로그래밍  (0) 2024.11.30
[Java와 비교하는 Kotlin] 기본 개념 #3  (0) 2024.11.24
[Java와 비교하는 Kotlin] 기본 개념 #2  (0) 2024.11.24