
Live강의다보니 적으면서 두서없이 정리된 부분이 있다.
일단 교육 진행하면서 꼭 기록을 남기는 것을 목표로 차근차근 노력해보자.
2023-12-27~2024-01-08 : 코틀린 언어
2024-01-09~2024-01-15 : 학생정보 관리 프로젝트(코틀린)
2024-01-16~2024-02-07 : 안드로이드 1차 수업
2024-02-08 : 깃허브
2024-02-13~2024-02-14 : 메모 어플리케이션 프로젝트(안드로이드)
2024-02-15~2024-02-28 : 안드로이드 2차 수업
2024-02-29~2024-03-07 : 게시판 프로젝트(안드로이드)
2024-03-11~2024-03-12 : 디자인 패턴(MVVM)
2024-03-13~2024-04-26 : 쇼핑몰 프로젝트(기획 및 개발)
2024-04-29~2024-05-01 : 다트 언어
2024-05-02~2024-05-08 : 플러터
2024-05-09~2024-05-16 : 플러터 프로젝트
2024-05-17~2024-06-12 : 자율 프로젝트(안드로이드/플러터)
2024-06-13 : 수료
src폴더에 생성한 main.kt 파일을 실행하면
-> kt파일을 자바파일로 변경함
-> 코틀린 컴파일러가 out 폴더에 자바 class를 생성함
-> 윈도우용 Java VM이 class파일을 실행함(Mac에서는 Mac용 Java VM이)
대부분의 프로그래밍 언어 -> C언어 기반임 -> 기계어(windows, mac, linux OS별로 다름)
한국어로 된 책을 다른 나라에서도 읽을 수 있게 하려면
각 나라의 출판사에서 판권을 사와서 각 나라 언어 번역본을 출간함
-> C언어 방식
C언어로 만든 프로그램이 있는 경우,
windows에서 실행할 수 있게 만드는 작업(.exe파일)
linux에서 실행할 수 있게 만드는 작업
mac에서 실행할 수 있게 만드는 작업을 모두 해줘야 함
개발자가 windows에서만 돌아가는 프로그램을 만든 경우에는 다른 os에서 실행이 불가함
각 OS에서 실행할 수 있게 기계어로 번역이 된 상태이기 때문에 프로그램 속도가 빠르다
=> 속도는 빠르지만 시간과 비용이 많이 소모됨
VM(Virtual Machine)을 사용하는 방법(통역)
VM이 하는 일은 많지만 그중 대표적인 기능이 기계어 번역임(OS별로)
실행을 할 때 코드를 한줄 한줄 일일이 번역을 하면서 실행을 해줌(비효율적, 시간소요)
그러나 C언어의 경우와 달리 OS에 맞추는 작업을 할 필요없이 코드를 한번만 짜주면 VM이 OS에 맞춰서 번역을 해서 실행해준다.
컴퓨터의 성능이 발전하면서 이러한 방식을 고집해도 성능 저하의 체감이 거의 없음
닷넷프레임워크는 윈도우에서 사용하는 대표적인 VM이다.
자바는 JVM(윈도우용, 맥용, 리눅스용이 따로 있다)
class파일 안에는 JVM이 인식할 수 있는 코드가 있어서 이를 JVM이 실행할 수 있게 해줌
CPU와 저장소의 속도 차이를 극복하기 위해 중간에 RAM을 추가함
CPU <- RAM <- DISK
CPU가 사용할 데이터를 DISK에서 RAM으로 저장함
CPU는 RAM에 저장된 데이터를 사용해서 처리하는 구조
RAM은 전력공급이 차단되면 RAM에 저장되어있던 내용들이 날라감
프로그램 처리에 필요한 코드를 RAM에 저장해주는 과정이 꼭 필요
(프로그래머는 VM에 이 과정을 요청해준다)
RAM에 데이터를 저장하려면 공간이 필요함(위치, 크기, 용도)
논리적인 하나의 공간
데이터 단위는 1bit부터 시작
8bit -> 1byte (글자 하나를 표현할 수 있음)
bit는 전구 2개
8bit,1byte는 전구 128개
문자를 2진수로 어떻게 표현할 방법이 없어서 그냥 정수값을 지정해줌
영문(0~127) -> 2의 8승 -> 1byte(글자 하나를 표현하기 위해 필요한 용량)
-> 영문 기준임
전세계 언어를 모아보다보니 byte 용량이 더 커짐
한글은 글자 하나당 2byte임
RAM은 하나의 공간이 1byte부터 시작함
정수 500을 저장할 경우 2byte크기의 공간 1개를 차지하게 됨
RAM에 기억공간을 만드려면 용도와 크기와 위치가 결정되어야 함
// : 한 줄 주석/* */ : 여러 줄 주석Ctrl + /Long(8), Int(4), Short(2), Byte(1)
정수 Int 값의 크기는 4byte로 -2147483648~2147483647의 범위를 가짐
자바의 경우 정수값을 작성하면 4byte 기억공간이 마련되기 때문에, 아래와 같이 범위를 벗어난 값을 작성하면 오류가 발생한다.
Long 8byte 기억공간이 만들어질 수 있도록 L을 값 뒤에 붙여줘야 한다.
println(2147483648L)
println(-2147483649L)
그런데 코틀린의 경우 L을 붙이지 않더라도 작성된 값을 보고 Java코드로 변환될 때 4byte로 충분한 경우 정수값 그대로 유지되고, 8byte 기억공간이 필요한 값이라면 뒤에 L을 붙인 코드로 변경된다
즉 코틀린은 정수값을 작성할 때 값의 범위를 보고 뒤에 L을 붙여주지 않아도 된다.
println(2147483648)
println(-2147483649)
정수값을 작성할 때 자리수 구분을 위해 언더바(_)를 사용할 수 있다.
println(123_456_789)
ULong(8), UInt(4), UShort(2), UByte(1)
Double(8), Float(4)
기본 8 byte이며 Float타입은 값 뒤에 F를 붙이고 4 byte지만 보통 사용하지 않음
옛날에는 메모리 관리를 위해 구분을 하려고 했지만 지금은 굳이 그럴 필요 없음
println(11.11)
println(11.11F)
Char(2)
보통 2byte이나 실행되는 시스템을 따라간다.
내부적으로 정수값으로 관리된다.
println('A')
println('가')
String
작성한 글자 수 만큼 메모리를 사용한다.
객체라는 것으로 관리된다.
println("문자열")
true는 참을 의미
false는 거짓을 의미
println(true)
println(false)
여러 줄의 문자열을 표현할 때 사용한다.
자바에는 없음.
println("""동해물과 백두산이
|마르고 닳도록
|하느님이 보우하사
|우리나라 만세
""".trimMargin())
fun main() {
// 정수 자료형
println("Byte 용량 : "+Byte.SIZE_BYTES)
println("Byte 최소 값 : "+Byte.MIN_VALUE)
println("Byte 최대 값 : "+Byte.MAX_VALUE)
println()
println("Short 용량 : "+Short.SIZE_BYTES)
println("Short 최소 값 : "+Short.MIN_VALUE)
println("Short 최대 값 : "+Short.MAX_VALUE)
println()
// 정수값을 작성하면 4 byte 기억공간이 만들어지고 저장되기 때문에
// Int 를 정수의 기본 자료형으로 부른다.
println("Int 용량 : "+Int.SIZE_BYTES)
println("Int 최소 값 : "+Int.MIN_VALUE)
println("Int 최대 값 : "+Int.MAX_VALUE)
println()
println("Long 용량 : "+Long.SIZE_BYTES)
println("Long 최소 값 : "+Long.MIN_VALUE)
println("Long 최대 값 : "+Long.MAX_VALUE)
println()
// 부호가 없는 정수형 (Unside)
// 저장공간에 저장할 수 있는 값의 가지수를 절반 짤라서 양수와 음수로 나눠서 사용하는데
// 부호가 없는 자료형을 쓰면 0부터의 범위가 된다.
// 양수쪽으로 더 큰 범위의 숫자를 저장할 수 있다.
println("UByte 용량 : " + UByte.SIZE_BYTES)
println("UByte 최소 값 : " + UByte.MIN_VALUE)
println("UByte 최대 값 : " + UByte.MAX_VALUE)
println()
}
Byte 용량 : 1
Byte 최소 값 : -128
Byte 최대 값 : 127
Short 용량 : 2
Short 최소 값 : -32768
Short 최대 값 : 32767
Int 용량 : 4
Int 최소 값 : -2147483648
Int 최대 값 : 2147483647
Long 용량 : 8
Long 최소 값 : -9223372036854775808
Long 최대 값 : 9223372036854775807
UByte 용량 : 1
UByte 최소 값 : 0
UByte 최대 값 : 255
저장공간에 저장할 수 있는 값의 가지수를 절반 짤라서 양수와 음수로 나눠서 사용하는데 부호가 없는 자료형을 쓰면 0부터의 범위가 된다.
양수쪽으로 더 큰 범위의 숫자를 저장할 수 있다.
fun main() {
println("UByte 용량 : " + UByte.SIZE_BYTES)
println("UByte 최소 값 : " + UByte.MIN_VALUE)
println("UByte 최대 값 : " + UByte.MAX_VALUE)
println()
println("UShort 용량 : " + UShort.SIZE_BYTES)
println("UShort 최소 값 : " + UShort.MIN_VALUE)
println("UShort 최대 값 : " + UShort.MAX_VALUE)
println()
println("UInt 용량 : " + UInt.SIZE_BYTES)
println("UInt 최소 값 : " + UInt.MIN_VALUE)
println("UInt 최대 값 : " + UInt.MAX_VALUE)
println()
println("ULong 용량 : " + ULong.SIZE_BYTES)
println("ULong 최소 값 : " + ULong.MIN_VALUE)
println("ULong 최대 값 : " + ULong.MAX_VALUE)
println()
}
UByte 용량 : 1
UByte 최소 값 : 0
UByte 최대 값 : 255
UShort 용량 : 2
UShort 최소 값 : 0
UShort 최대 값 : 65535
UInt 용량 : 4
UInt 최소 값 : 0
UInt 최대 값 : 4294967295
ULong 용량 : 8
ULong 최소 값 : 0
ULong 최대 값 : 18446744073709551615
실수 리터럴을 작성하면 8 바이트 기억공간이 만들어져서 저장된다.
이에, Double을 실수의 기본 자료형이라고 부른다.
println("Float 용량 : " + Float.SIZE_BYTES)
println("Float 최소 값 : " + Float.MIN_VALUE)
println("Float 최대 값 : " + Float.MAX_VALUE)
println()
println("Double 용량 : " + Double.SIZE_BYTES)
println("Double 최소 값 : " + Double.MIN_VALUE)
println("Double 최대 값 : " + Double.MAX_VALUE)
println()
Float 용량 : 4
Float 최소 값 : 1.4E-45
Float 최대 값 : 3.4028235E38
Double 용량 : 8
Double 최소 값 : 4.9E-324
Double 최대 값 : 1.7976931348623157E308
Boolean
논리형은 1바이트를 사용한다.
별도의 사이즈를 반환하는 메서드가 없음
println("Char 용량 : " + Char.SIZE_BYTES)
println("Char 최소 값 : " + Char.MIN_VALUE)
println("Char 최대 값 : " + Char.MAX_VALUE)
println()
Char 용량 : 2
Char 최소 값 : 0
Char 최대 값 : 0
문자는 최소값,최대값이 없기 때문에 0으로 출력된다.
String
문자열은 정확히 말하자면 자료형이 아님
일단은 문자열 타입이라고 생각하고 진행하기
// Int 타입(정수형, 4byte)의 a1이라는 이름의 변수를 선언한다.
var a1:Int
var a3 = 400
println("a3 : " + a3)
println("a3 type : " + a3.javaClass.name)
var a4 = 11.11
println("a4 : " + a4)
println("a4 type : " + a4.javaClass.name)
a3 type : int
a4 : 11.11
a4 type : double
var a5 // 에러 발생
var a4 = 11.11
a4 = "안녕하세요" // 에러 발생
var a20 = "안녕하세요" + "반갑습니다"
println("a20 : " + a20)
a20 : 안녕하세요 반갑습니다
var a21 = "나이는 : " + 20
println("a21 : " + a21)
a21 : 나이는 : 20
var a22 = "나이는 : ${20}"
println("a22 : ${a22}")
a22 : 나이는 : 20
var a23 = 20
var a24 = "나이는 $a23"
println("a24 : $a24")
a24 : 나이는 20
val a30 = 100
println("a30 : $a30")
a30 = 200 // 실행 시 에러
a30 : 100
※ 출처 : 멋쟁이사자 앱스쿨 2기, 소프트캠퍼스