본문 바로가기

개발 노트/Kotlin

[kotlin] 문법 2주차 정리 - 기초

# 코딩 컨벤션 

- 다른 사람들도 이해하기 쉽게 코드를 작성하는 규칙

- 코드의 가독성이 증가해서 나중에 봐도 쉽게 이해가능

- 유지보수가 용이

- 효율적인 협업 가능

 

 

- 카멜케이스 표기법

  • 주로 변수, 메소드 이름 지정할 때 사용
seoulFood (O)

 

 

- 스네이크케이스 표기법

  • 주로 상수의 이름 지정할 때 사용
seoul_food (O)

 

 

- 파스칼케이스 표기법

  • 주로 클래스의 이름을 지정할 때 사용
SeoulFood (O)

 

 

 

 

# 출력과 입력 

- 출력 (Output)

  • 프로그램에서 다른 장치로 데이터를 전송하는 행위 
  • ex) 프로그램의 결과를 모니터로 정보 출력

- 입력 (Input)

  • 다른 장치로부터 데이터를 불러와서 프로그램에서 확인하는 행위
  • ex) 키보드에서 입력한 내용을 불러와서 프로그램에서 확인

 

 

 

# 자료형

- 자료를 저장할 수 있는 적절한 형태 

- 제한적인 자원을 효율적으로 사용하기 위해 (상황에 맞는 적절한 형태의 데이터타입을 사용해서 낭비를 줄이고 효율적으로 사용하자)

구분 데이터타입 설명
숫자형 Double 64비트 정수
  Float
32비트 정수
  Long 64비트 정수
  Int 32비트 정수
  Short 16비트 정수
  Byte 8비트 정수
문자형 Char 1 개의 문자
  String
여러 개의 문자
 
불리언형 Boolean true, false

 

 

 

# 변수와 상수 

- 변수 (var - 변할 수 있다)

  • 숫자를 나타내는 변수
// var num1:Int = 1
// var 변수이름:자료형(생략가능) = 값
// 값을 특정 자료형을 저장할 수 있는 변수이름에 대입한다
var num1 = 1
println("내 첫변수 num1 변수에는 ${num1}이 들어있어")

num1 = 5
println("변경한 변수 num1 변수에는 ${num1}이 들어있어")


// 결과
//내 첫변수 num1 변수에는 1이 들어있어
//변경한 변수 num1 변수에는 5이 들어있어

 

  • 문자를 나타내는 변수
// var one1:Char = '김'
// var 변수이름:타입(생략가능) = 값
var one1 = '김'
println("내 첫변수 one1 변수에는 ${one1}이 들어있어")

one1 = '나' // one1변수에 들어있던 '김' 대신에 '나'를 대입
println("변경한 변수 one1 변수에는 ${one1}가 들어있어")

//결과
//내 첫변수 one1 변수에는 김이 들어있어
//변경한 변수 one1 변수에는 나가 들어있어

 

  • 문자열을 나타내는 변수
// var name:String = "참새"
var name = "참새"
println("새의 이름을 저장하는 name 변수에는 ${name}가 들어있어")

name = "조롱박이" // name변수에 들어있던 "참새" 대신에 "조롱박이"를 대입
println("변경한 변수 name에는 ${name}가 들어있어")

//결과
//새의 이름을 저장하는 name 변수에는 참새가 들어있어
//변경한 변수 name에는 조롱박이가 들어있어

 

 

- 상수 (val - 변할 수 없다)

val num1 = 1
println("내 첫변수 num1 변수에는 ${num1}이 들어있어")

// Val cannot be reassigned 에러 발생!!
// num1은 var이 아니라 val이기때문에 들어있는 값을 변경하지 못함
num1 = 5

println("변경한 변수 num1 변수에는 ${num1}이 들어있어")

 

-> 상수는 변경할 수 없기 때문에, num1이라는 변수를 변경하려고하면 오류가 뜨기 때문에 num1 = 5는 삭제해줘야함 

삭제하고 코드 재실행해주면 출력이 잘 된다

 

 

 

# 연산자의 종류 

- 산술연산자 (+,-,*,/,%)

    var num1 = 30
    var num2 = 10
    
    // 덧셈 연산자(+)사용해서 num1과 num2를 더한후에 plusResult에 대입함
    var plusResult = num1 + num2
    println("num1 + num2는 ${plusResult}이야")

    // 뺄셈 연산자(-)사용해서 num1에서 num2를 뺀후에 minusResult에 대입함
    var minusResult = num1 - num2
    println("num1 - num2는 ${minusResult}이야")

    // 곱셈 연산자(*)사용해서 num1과 num2를 곱한후에 multipleResult에 대입함
    var multipleResult = num1 * num2
    println("num1 * num2는 ${multipleResult}이야")

    // 나눗셈 연산자(/)사용해서 num1에서 num2를 나눈후에 divideResult에 대입함
    var divideResult = num1 / num2
    println("num1 / num2는 ${divideResult}이야")
    
    // num2를 10에서 7로 변경
    num2 = 7

    // 나머지 연산자(%)사용해서 num1에서 num2를 나눈 나머지를 modResult에 대입함
    var modResult = num1 % num2
    println("num1 % num2는 정수로 ${modResult}야")
    
    
    // 결과
	//num1 + num2는 40이야
	//num1 - num2는 20이야
	//num1 * num2는 300이야
	//num1 / num2는 3이야
	//num1 % num2는 정수로 2야

 

 

- 대입연산자 (=)

		// = 기준으로
    // 오른쪽: "참새"
    // 왼쪽의 이름: name
    // 즉, "참새"를 name변수에 대입한다라고 읽을 수 있음
    var name = "참새"
    println("내 이름은 ${name}")

    // = 기준으로
    // 오른쪽: 10
    // 왼쪽의 이름: age
    // 즉, 10을 age변수에 대입한다라고 읽을 수 있음
    val age = 10
    println("내 나이는 ${age}")
    
    //결과
    //내 이름은 참새
    //내 나이는 10

 

 

-복합 대입연산자(+= ,-= ,*= , /=, %=)

    var num1 = 30
    var num2 = 10

    // 산술연산자와 대입연산자를 따로 사용
    // num1의 값을 10 증가시켜서 40을 만들고 싶다면?
    num1 = num1 + 10
    println("산술, 대입 따로 적용한 결과 ${num1}")

    // 복합대입연산자를 사용
    // num2의 값을 10 증가시켜서 20을 만들고 싶다면?
    num2 += 10
    println("산술, 대입 따로 적용한 결과 ${num2}")
    
    // 뺄셈, 곱셈, 나눗셈, 나머지연산도 동일하게 사용가능해요
    // 뺄셈: a-=b
    // 곱셈: a*=b
    // 나눗셈: a/=b
    // 나머지: a%=b
    
    
    //결과
    //산술, 대입 따로 적용한 결과 40
    //산술, 대입 따로 적용한 결과 20

 

 

- 증감 연산자(++, --)

-> 변수의 왼쪽에 위치하면 전위연산자, 변수의 오른쪽에 위치하면 후위연산자

-> 단독적으로 사용하면 결과값 동일, 다른 연산과 같이 사용했을때 차이가 발생

    var num1 = 10
    var num2 = 20
    var num3 = 30
    
    // 후위연산자는 println연산을 실행후에 증감해요
    println(num1++)		//10
    println(num1)		//11
    
    // 전위연산자는 println연산 실행전에 증감해요
    println(++num2)		//21
    println(num2)		//21
    
    num3++				
    println(num3)		//31
    
    ++num3
    println(num3)		//32
    
    
    //결과
    //10
    //11
    //21
    //21
    //31
    //32

 

 

- 비교연산자(로직연산자) ( >, >=, <, <=, ==, != )

결과는 Boolean의 형식인 true 또는 false로 나온다

    // 수학은 94점
    var mathScore = 94

    // 수학점수가 90점 초과인지 판단
    var isMathHighRank = mathScore > 90

    // 90점 초과라면 true (참)
    // 90점 이하라면 false (거짓)
    println("내 수학점수는 고등급이 맞나요? ${isMathHighRank}")
    
    //결과
    //내 수학점수는 고등급이 맞나요? true

 

    // 영어는 60점
    var englishScore = 60

    // 국어점수가 60점 이상인지 판단
    var isEnglishMiddleRank = englishScore >= 60

    // 60점 이상이라면 true (참)
    // 60점 미만이라면 false (거짓)
    println("내 영어점수는 턱걸이로 중위권이 맞나요? ${isEnglishMiddleRank}")
    
    //결과
    //내 영어점수는 턱걸이로 중위권이 맞나요? true

 

    var baseAge = 20
    var myAge = 20
    var teacherAge = 50
    var babyAge = 7

    var isMyAgePass = myAge == baseAge
    var isTeacherAgePass = teacherAge == baseAge
    var isBabyAgeNoPass = babyAge != baseAge

    println("어서오세요~")
    println("이번 이벤트는 ${baseAge}살만 참여할 수 있습니다!")

    println("================신분증 검사중================")

    println("내 나이는 ${myAge}니까 ${isMyAgePass}다!")
    println("선생님 연세는 ${teacherAge}니까 ${isTeacherAgePass}네요.. 미안해요!")
    println("${babyAge}살은 참여할수 없는게 맞아요! ${isBabyAgeNoPass}")
    
    
    
    //결과
    //어서오세요~
	//이번 이벤트는 20살만 참여할 수 있습니다!
    //================신분증 검사중================
    //내 나이는 20니까 true다!
    //선생님 연세는 50니까 false네요.. 미안해요!
    //7살은 참여할수 없는게 맞아요! true

 

 

 

 

# 조건식 (if, when)

- if - else 구조

// 조건식은 앞서배운 비교 연산자를 사용합니다
// 즉, 조건식 자리에는 true 또는 false의 결과가 들어갑니다
// 조건식이 true일때 중괄호 안의 코드를 실행합니다
if(조건식) {
	 // 실행할 코드
}


// 둘 중 한개의 코드만 실행됩니다
if(조건식) {
	// 조건식이 true일때 실행할 코드
} else {
  // 조건식이 false일때 실행할 코드
}

 

- when 구조 

when(변수 또는 상수) {
	 값1 -> {
			// 실행할 코드
   }
	 값2 -> {
		  // 실행할 코드
   }
   else -> {
			// 실행할 코드
	 }
}

 

 

 

 

- 예제

  • 특정 이름을 가진 사람일때 축하메시지를 띄워주기
    var eventName = "참새"
    var myName = "참새"

    if(myName == eventName) {
        println("환영합니다 ${myName}님! 이벤트에 당첨됐어요!")
    } else {
        println("환영합니다 ${myName}님!")
    }
    
    //결과
    //환영합니다 참새님! 이벤트에 당첨됐어요!

 

 

  • 티켓 100개가 전부 매진되면 더 이상 구매할 수 없다고 알림창을 띄워주기
티켓 100개가 전부 매진되면 더 이상 구매할 수 없다고 알림창을 띄워줘요의 예시입니다.

var ticketCount = 0

if(ticketCount > 0) {
		println("티켓을 구매했어요")
} else {
	  println("티켓이 모두 매진되었습니다")
}


//결과
//티켓이 모두 매진되었습니다

 

 

  • 기말고사 평균점수를 구간별로 나눠서 A,B,C,D 등급을 매겨주기 (고정값)
    var koreanScore = 88
    var englishScore = 92
    var mathScore = 99
    var average = (koreanScore + englishScore + mathScore) / 3
    
    if(average >= 90) {
        println("당신의 등급은 A입니다")
    } else if(average >= 80) {
        println("당신의 등급은 B입니다")
    } else if(average >= 70) {
        println("당신의 등급은 C입니다")
    } else {
        println("당신의 등급은 F입니다")
    }
    
    
    //결과
    //당신의 등급은 A입니다

 

 

  • 기말고사 평균점수를 구간별로 나눠서 A,B,C,D 등급을 매겨주기 (입력값)
    var koreanScore = readLine()!!.toInt() // 국어점수 입력
    var englishScore = readLine()!!.toInt() // 영어점수 입력
    var mathScore = readLine()!!.toInt() // 수학점수 입력
    var average = (koreanScore + englishScore + mathScore) / 3
    
    if(average >= 90) {
        println("당신의 등급은 A입니다")
    } else if(average >= 80) {
        println("당신의 등급은 B입니다")
    } else if(average >= 70) {
        println("당신의 등급은 C입니다")
    } else {
        println("당신의 등급은 F입니다")
    }
    
    //결과(내가 키보드로 입력한 숫자에따라 출력값 달라짐)
    //100
    //70
    //74
    //당신의 등급은 B입니다

 

 

  • 행운의 숫자를 뽑아서 운세를 알려주기
    var todayNumber = readLine()!!.toInt()

    when(todayNumber) {
        1 -> {
            println("재물이 들어올것입니다")
        }
        2 -> {
            println("검정색을 조심하세요")
        }
        3 -> {
            println("지인과의 관계에 조심하세요")
        }
        else -> {
            println("물을 조심하십시오...")
        }
    }
    
    
    //결과(내가 키보드로 입력한 숫자에따라 출력값 달라짐)
    //7
    //물을 조심하십시오...

 

 

 

 

 

 

 

# 반복문 (for, while)

- for문 구조 

// 코틀린의 for 반복문은 다양한 형태가 존재합니다.

// 리스트(묶음)에서 하나의 요소들을 반복해서 가져오는 경우입니다
for(요소 in 리스트) {
	  소스코드 (로직)
}

// 숫자의 범위를 기준으로 반복하는 경우입니다
// 시작값이 0이고, 마지막값이 5라면 인덱스는 0,1,2,3,4이므로 총 5번 반복해요
// until을 생략해서 시작값..마지막값으로 사용할수도 있어요
for(인덱스 in 시작값 until 마지막값) {
		소스코드 (로직)
}

 

 

- while문 구조 

// 코틀린의 while 반복문은 조건식, 증감식을 이용합니다

while(조건식) {
		소스코드 (로직)
		증감식
}

 

 

 

- 예제

  • 내이름을 10번 출력하기  (for문)
//내 이름을 10번 출력해요 (for)의 예시입니다

// 1부터 10까지 변화하는 i변수
for(i in 1..10) {
	 println("${i}번째: 내 이름은 참새")
}

//결과
//1번째: 내 이름은 참새
//2번째: 내 이름은 참새
//3번째: 내 이름은 참새
//4번째: 내 이름은 참새
//5번째: 내 이름은 참새
//6번째: 내 이름은 참새
//7번째: 내 이름은 참새
//8번째: 내 이름은 참새
//9번째: 내 이름은 참새
//10번째: 내 이름은 참새

 

-> 1 .. 10 이라고 썼을땐 1부터 10까지 ( 1 ≤ i ≤ 10) 반복문을 돌음 

 

    //내 이름을 10번 출력해요 (for)의 예시입니다

// 1부터 10까지 변화하는 i변수
            for(i in 1 until 10) {
                println("${i}번째: 내 이름은 참새")
            }
            

//결과
//1번째: 내 이름은 참새
//2번째: 내 이름은 참새
//3번째: 내 이름은 참새
//4번째: 내 이름은 참새
//5번째: 내 이름은 참새
//6번째: 내 이름은 참새
//7번째: 내 이름은 참새
//8번째: 내 이름은 참새
//9번째: 내 이름은 참새

 

-> 1 until 10 이라고 썼을땐 1부터 9까지 ( 1 ≤ i < 10 ) 반복문을 돌음

-> until마지막숫자는 포함하지 않는다!!

 

 

  • 내이름을 10번 출력하기 (while문)
    var i = 0

    while(i < 10) {
        println("${i}번째: 내 이름은 참새")
        i++
    }
    
//결과
//0번째: 내 이름은 참새
//1번째: 내 이름은 참새
//2번째: 내 이름은 참새
//3번째: 내 이름은 참새
//4번째: 내 이름은 참새
//5번째: 내 이름은 참새
//6번째: 내 이름은 참새
//7번째: 내 이름은 참새
//8번째: 내 이름은 참새
//9번째: 내 이름은 참새

 

 

  • 전화번호부에서 이름이 “참새”인 사람을 찾을때까지 한명씩 조회하고 비교하기
    var infos = arrayOf("꿩", "닭", "참새", "오목눈이", "공작새")

    for(info in infos) {

        if(info == "참새") {
            println("찾았다 참새!")
            break
            
        } else {
            continue
        }
    }
    
    
    //결과
    //찾았다 참새!

 

-> break는 가장 가까운 반복문에서 탈출하고 다음 블록으로 넘어감

-> continue는 이후의 코드를 실행하지 않음 

 

 

  • 상자에서 사료를꺼내 고양이에게 10번 먹여주기
    var catStatus = false
    println("고양이는 매우 배고픕니다..")
    println("사료를 10번 먹여주세요")


    // 고양이가 현재 배고프니까(false) 사료 배급가능
    if(catStatus == false) {
        for(idx in 0..9) {
            println("${idx}번째: 냠냠")
        }
    }

    // 사료를 10번 준 이후의 상태변화
    catStatus = true
    if(catStatus == true) {
        println("배부른 고양이입니다")
    }
    
//결과
//고양이는 매우 배고픕니다..
//사료를 10번 먹여주세요
//0번째: 냠냠
//1번째: 냠냠
//2번째: 냠냠
//3번째: 냠냠
//4번째: 냠냠
//5번째: 냠냠
//6번째: 냠냠
//7번째: 냠냠
//8번째: 냠냠
//9번째: 냠냠
//배부른 고양이입니다

 

 

 

 

# 전체 예제 

    val worldName = "스코월드"
    var myName = readLine()
    var myAge = readLine()!!.toInt()
    var myJob = readLine()

    var isNamePass = true
    var isAgePass = true
    var isJobPass = true

    var names = arrayOf("참새", "꿩", "비둘기")
    for(name in names) {
        if(myName == name) {
            println("중복된 이름이 존재합니다.")
            isNamePass = false
            break
        }
    }

    if(myAge < 12) {
        println("12세 미만은 이용할 수 없습니다.")
        isAgePass = false
    }
    if(myJob == "전사") {
        println("일시적으로 전사를 이용할 수 없습니다.")
        isJobPass = false
    }

    // 모든 조건을 통과한 경우에만 환영
    if(isNamePass && isAgePass && isJobPass) {
        println("==================${worldName}에 오신것을 환영합니다==================")
        println("당신의 정보는 다음과 같습니다.")
        println("이름: ${myName}입니다.")
        println("나이: ${myAge}입니다.")
        println("직업: ${myJob}입니다.")
        println("모험을 떠나 볼까요?")
    }
    
    
    
//결과 (내가 키보드로 입력한 숫자에따라 출력값 달라짐)
독수리
13
새
==================스코월드에 오신것을 환영합니다==================
당신의 정보는 다음과 같습니다.
이름: 독수리입니다.
나이: 13입니다.
직업: 새입니다.
모험을 떠나 볼까요?