Kotlin TIL(2) [객체지향 프로그래밍, 예외처리, 지연초기화, 컬렉션, 싱글턴]

jxxn_a·2023년 7월 18일
0

TIL

목록 보기
2/28

객체지향 프로그래밍?

프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

◼ 접근제한자

  1. 객체를 이용해서 변수나 메소드를 호출할 수 있는지의 여부를 접근이라고 한다.
  2. Kotlin에서는 Public, private, internal, protected로 접근을 제한한다.

▲ 접근제한자 종류

  1. public: 명시하지 않으면 기본적으로 public (어디서나 접근 가능)
  2. private: 동일한 클래스 내부에서만 접근 가능하다.
  3. internal: 같은 모듈 내부에서만 접근 가능하다.
  4. protected: 기본적으로 private이지만, 상속을 받은 경우에 타 모듈에서 접근 가능하다.

▲ 접근제한자의 장점

  • 접근 권한을 통해 무분별한 접근을 막을 수 있다.
  • 클래스 간에 접근하면 안되는 상황을 구분하기 때문에 향후에 유지보수에 용이하다.

◼ 예외처리

  • 프로그램 실행도중에 발생하는 예외를 적절하게 처리한다.
    -> 프로그램을 실행하기 전에 알 수 있는 컴파일 에러를 오류라고한다.
    -> 프로그램을 실행하는 도중에 발생하는 런타임 에러인 예외가 발생할 수 있다.
    -> 실행도중에 예외가 발생하면 프로그램이 비정상적으로 종료된다.

▲ 예외처리 예시

1. try-catch 구조

fun method1() {
    try {
      예외가 발생할 가능성이 존재하는 코드
    } catch(예외종류) {
      예외가 발생했을 때 처리할 코드
    }
}

2. throw 구조

fun method1(num1:Int) {
    if(num1 > 10) {
      throw 예외종류
    }
}

▲ 예외처리 사용

  1. 숫자를 입력받아서 더하는 프로그램인데 실수로 문자를 입력했다면 예외처리해야한다.
  2. USB와 연결하는 코드는 반드시 사용 후에 연결을 끊어야한다.(자원낭비)
  • 설명
    -> 고품질의 프로그램이란 사용성을 해치지 않아야한다.
    -> 프로그램이 도중에 종료되는 것은 심각한 문제이다.
    -> 미리 예외를 생각하고 소스코드를 작성해야 안정성을 높인 프로그램이라고 할 수 있다.

◼ 지연초기화

  • 변수나 상수의 값을 나중에 초기화 할 수 있다.
  • Kotlin은 클래스를 설계할 때 안정성을 위해 반드시 변수의 값을 초기화 할 것을 권장한다.
  • 클래스를 설계할 때 초기의 값을 정의하지 않고 나중에 대입하기 위한 문법이다.
  • 저사양으로 제한되어있는 환경에서는 메모리를 더욱 효율적으로 사용할 수 있다.

▲ 지연초기화 방법 및 예시

  1. lateinit -> 변수
  • 기본사용: name변수 값을 초기에 정의하기 어렵기 때문에 lateinit을 사용한다.
  • 고급 사용: 변수를 사용하기 전에 초기화되었는지 확인해야 안정성을 높일 수있다.
  1. lazy -> 상수
  • 상수를 사용하는 시점에 값을 대입하면 초기화가 수행된다.

◼ Null 세이프티

  • Kotiln의 Null 안정성을 향상시켜 줄 수 있다.
  • Null 예외는 프로그램의 가용성을 저하시키는 치명적인 오류다.
  • Kotlin은 Null예외로부터 안전한 설계를 위해 자료형에 Null 여부를 명시할 수 있다.

▲ Null 세이프티 방법

  • Kotlin은 ?, !!, ?., ?:로 Null예외로부터 살아남으려고 한다.
  • 강제로 Null이 아니라고하는 !!는 최대한 사용하지 않기!

◼ 배열

-> 변수에 순서를 매겨서 활용 할 수있다.

▲ 배열 사용방법

  • arrayOf메소드(키워드)를 제공한다.
var arr = arrayOf(1,2,3,4,5)

▲ 배열 사용

  • 배열이 없으면 점수를 저장하기 위해 score1, score2, score3 처럼 변수를 각각 만들어주어야한다.
  • 배열을 사용하면 scores로 점수들을 묶어 효율적으로 코드를 작성할 수 있다.
var scores = arrayOf(90, 92, 95)

◼ 컬렉션

-> 개발에 유용한 자료구조인 List, Map, Set을 지원한다.

▲ 컬렉션 사용방법
- List
: 읽기전용과 수정가능한 종류로 구분된다.
: 배열과 다르게 크기가 정해져있지 않아서 동적으로 값을 추가할 수 있다.

var scores1 = listOf(값1, 값2, 값3)

var scores2 = mutableListOf(값1, 값2, 값3)
scores.set(인덱스, 값)

var scores3 = ArrayList<자료형>(값1, 값2, 값3)
scores3.set(인덱스, 값)

- Map
: Key와 Value와 한 쌍으로 이루어진 자료형이다.
: 읽기전용과 수정가능한 종류로 구분된다.

var scoreInfo1 = mapOf("kor" to 94, "math" to 90, "eng" to 90)
println(scoreInfo1["kor"])

var scoreInfo2 = mutableMapOf("kor" to 94, "math" to 90)
scoreInfo2["eng"] = 92
println(scoreInfo2["eng"])

for((k,v) in scoreInfo2) {
     println("${k}의 값은 ${v}입니다.")
}

- Set
: 순서가 존재하지 않고 중복없이 데이터를 관리하는 집합 자료형이다.
: 읽기전용과 수정가능한 종류로 구분된다.
: 다른 컬렉션들은 요소를 찾는데 집중하지만, Set은 요소가 존재하는지에 집중한다.
: 교집합, 차집합, 합집합으로 간편하게 요소를 추출 할 수 있다.

var animalSet = setOf("강아지", "고양이", "토끼")

println("동물의 크기는 ${animalSet.size}입니다.")

var findAmimal = readLine()!!

if(animalSet.contains(findAnimal)) {
     println("${findAnimal} 종류는 존재합니다.")
} else {
     println("${findAnimal}은 존재하지 않습니다.")
}

◼ Single-expression function (람다식)

  • 하나의 메소드를 간결하게 표현할 수 있다.

▲ 람다식 구조

{매개변수1, 매개변수2... ->
    코드
}

◼ 싱글턴

  • 보통 객체는 자원이 가능한 만큼 생성할 수 있다.
  • 각각의 객체는 상이한 위치정보를 가지고 있어서 저장하는 값도 다 고유하다.
  • 싱글턴을 사용하면 그 객체는 메모리 전역에서 유일함을 보장하며, 위치정보가 고정된다.
  • 프로그램이 실행되는 시점에 메모리에 바로 로드해서 위치를 잡는다.
  • Kotlin은 companion, object 키워드로 싱글턴을 구현할 수 있다.

▲ 싱글턴 장점

  • 전역적으로 활용이 가능해서 다른 클래스에서 쉽게 접근이 가능하다.
  • 전역에서 공통적으로 사용하는 정보라면 메모리를 더 효율적으로 활용할 수 있다.
  • 객체 자원간의 충돌을 방지한다.

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

정보가 많아서 도움이 많이 됐습니다.

답글 달기