세이지메이커 주피터 노트북 터미널에서 파이썬 스크립트 실행시, 잘 수행되다가 갑자기 Killed 메시지 하나만 달랑 나오는 경우가 있습니다. 많이 당황 스러웠습니다. ㅠㅠ
나중에 알고보니 이런 혐상의 원인 중 하나는 메모리 부족입니다. 실행중인 인스턴스의 메모리보다 처리하려는 데이터가 많아서 Out of memory 가 발생하는 것 입니다. 따라서 해결 방법으로는 메모리 사이즈를 늘려주면 됩니다. 배치 인스턴스의 메모리 크기는 AWS Batch 메뉴중 작업정의(Job Definitions)에서 해당하는 작업정의의 내용을 수정할 수 있습니다.
fun whichOneIsBig (a: Int, b: Int) : Int = if(a>b) a else b
// when
fun checkNum (score: Int) : Bool {
when(score) {
0 -> println("This is zero")
1,2 -> println("This is 1 or 2")
// in 10..100 -> println("This is 10 ~ 100")
else -> println("This is over2")
}
}
// Expression vs Statement
Expression: 결과적으로 값을 만드는 표현, 문장, 문단(모든 코틀린 함수는 expression 왜냐하면 무엇이든 최소한 하나는 값을 반환하니까)
Statement는 Expression이 아닌 것, 명령을 지시하는, 값을 만들지 않는 표현, 문장, 문단
5. Array vs List
Array는 처음에 크기가 정해져서 생성됨
immutable(수정불가) List 와 mutable(수정가능) List 가 있음.
fun array() {
val array : Array<Int> = arrayOf(1,2,3)
val list : List<Int> = listOf(1,2,3)
val array2 : Array<Any> = arrayOf(1,"a",3.4f)
val list2 : List<Any> = listOf(1,"a",3L)
array[1] = 2
var result : Int = list.get(0) // 수정불가 값을 가져올 수만 있음.
val arrayList : ArrayList<Int> = arrayListOf<Int>() // 추가 삭제 가능
arrayList.add(10)
arrayList.add(20)
}
6. 반복문 for / while
fun forAndWhile (){
val students : ArrayList<String> = arrayListOf("Kim", "Lee", "Park")
for (name : String in students){
println("${name}")
}
}
for ( i :Int in 1..10 ) { } // 1부터 10까지 1씩 증가하며 10번 실행
for ( i :Int in 1..10 step 2 ) { } // 1부터 10까지 2씩 증가하며 5번 실행
for ( i :Int in 10 downTo 1 ) { } //10부터 1까지 감소하며 10번 실행
for ( i :Int in 1 untill 10 ) { }. // 1~ 9까지 1씩 증가하며 9번 실행
// 인덱스와 내용함께 사용하는 방법
for (( index : Int, name : String) in students.withIndex()) {
println("${index+1}번째 학생: ${name}")
}
while
var index = 0
while (index < 10) {
println("${index}")
index ++
} // 0부터 9까지 10번 수행
7. NonNull , Nullable
NPE : Null Point Exception Error Java에서는 런타임에 에러가 나서 확인이 어려웠는데 코틀린에서는 컴파일 타임에( 코드를 작성하는 시점에) 에러 발생을 미리 알려줌. null이 가능한 변수와 아닌변수를 미리 구분해 줌으로써 실행중에 발생하는 에러를 예방할 수 있음.
var name : String = "James" // NonNull type 변수로 null 이 들어갈 수 없음. 에러발생
var nullableName : String? = null // nullable 변수로 null 할당에도 에러가 없음. 이를 위해서 type옆에 ?(물음표)를 추가해줘야함
var nameInUpperCase : String = name.toUpperCase()
var nullableNameInUpperCase : String? = nullableName?.toUpperCase() // nullableName이 null 인 경우 대문자로 변환하려하면 에러가 이니라 null을 제공함
// ?:
위와 같은 경우 null 값이 아니라 디폴트 값을 제공하고 싶은 경우 엘비스 연산자를 사용(?:)
val lastName : String? = null
val fullName : String = name + " " + (lastName?: "No last name") // lastName 이 null 인경우 "No last name"을 사용
// !!
개발자가 null 이 아님을 보장한다는 의미. 사용 권장하지 않음.
// ignore null
fun ignoreNulls(str : String?) {
val email : String? = "id@email.com"
email?.let{
println("my email is ${email}")
} // email 이 null이 아니면 my email ~ 출력, null이면 null 출력
}
8. Class
생성자를 추가한 클래스. init 이 먼저 실행되고 그다음에 constructor가 실행됨
// 클래스 상속, 오버라이딩 overriding
Korean 객채 생성 후 singASong 을 실행하면 상속 받았기 때문에 Human의 메소드가 실행됨.
lalala가 출력됨
오버라이딩을 위해 모class의 singASong 메소드를 앞에서 open 해주고, 자식class(Korean)에서 override 오버라이딩 함
라라랄 이 출력됨
오버라이딩한 메소드 대신에 상위 클래스(Human)의 메소드를 그대로 사용하고 싶을땐 super를 이용하면 됨.
lalala와 라라랄 이 출력됨
상위 클래스의 프로퍼티도 사용할 수 있음. Human 에서 생성자에 name 이 있으므로 별도 할 당 없이도 디폴트 값을 읽어올 수 있음.
사용비용을 내지 않기 위해서 모든 서비스를 삭제 했다고 생각했는데 계속해서 비용이 청구/결제 되었습니다. Cost Explorer를 보니 EC2-기타 라는 항목으로 비용이 나가고 있었습니다. 정확지는 않지만 EIP 가 생성되어있어서 이 비용으로 나가고 있는 것 같았습니다.
그래서 이를 삭제하고자 시도했습니다. 그러나, 아무리 인터넷을 검색해서 따라해 봐도 EIP 삭제가 되지 않았습니다. 아니 따라할 수가 없었습니다. 왜냐하면 일반적인 삭제 경우가 아닌 것 같았습니다. 즉, 작업 버튼의 릴리즈 기능이 아예 활성화 되지 않았습니다.
탄력적IP 메뉴에들어가서 삭제할 EIP를 선택하고 작업 버튼을 클릭해 봐도 '탄력적 IP 주소 연결해제' 또는 릴리즈라는 메뉴는 아예 활성화 되지도 않았습니다.
삭제가되지 않은 예상 원인은 EIP에 NAT 게이트웨이가 연결되어 있어서 그런것 같습니다.
그래서 해결 방법인 결론을 말씀드리면,
먼저 NAT 게이트웨이를 삭제하시고 나서 EIP 삭제(릴리즈)를 시도하시면 됩니다.
연결된 NAT 케이트웨이를 삭제하고, EIP 메뉴에서 작업 버튼의 기능 리스트를 보면, 이제는 릴리즈 기능이 활성화 되고 삭제 가능합니다.
'탄력적 IP 주소 릴리즈"와 '탄력적 IP 주소 연결 해제" 기능이 아래 처럼 안보였는데....
NAT 게이트웨이 삭제 후에는 아래와 같이 보였습니다.
사실 이 방법은 VPC삭제를 시도하다가 NAT게이트웨이 등 먼저 삭제해야할 서비스가 있다는 것을 알게되었습니다.
비용을 안나오게 하기 위해서는 해당 VPC를 삭제하는 것이 더 좋은 것 같아 삭제 하였습니다.
참고하세요.
비용이 계속나와서 삭제하려고 했는데... 일단 서비스 삭제 작업을 했으니 한달 더 지켜봐야겠습니다.