Queue는 LIFO(Last In First Out) 구조로 data를 저장할 수 있는 자료 구조 이다.
Queue는 쉽게 생각하면, 줄서기를 생각할 수 있다.
먼저 저장된(enqueue)된 data는 먼저 빼낼수 있다(dequeue)
또한 front() method를 이용하여 Dequeue() 대상이 되는 현재 Queue안에 있는 data 중 가장 먼저 저장된 data가 무엇인지 알수 있다.
Queue의 interface는 아래와 같다.
public interface Queue {
public int size();
public boolean isEmpty();
public boolean isFull();
public Object front();
public void enqueue(Object elem);
public Object dequeue();
public String printQueue();
}
- push(), pop() 등의 명령어로 Last In First Out 구조를 가지고 data를 저장 할 수 있는 자료 구조
2. Stack의 구조 및 interface
가. Stack의 구조
나. Stack의 interface
public interface Stack {
public int size();
public boolean isEmpty();
public Object top();
public void push(Object element);
public Object pop();
public String printStack();
public boolean isFull();
}
- 저장은 push()를 통해서 이루어지고, push된 data는 Stack의 제일 상단(top)에 저장
- 저장된 data를 가져올때는 pop()을 사용하고 top에 위치한 data를 가져오며, pop() 된 data는 Stack에서 삭제
- isEmpty(), isFull(), size()를 통해 Stack의 현재 상태 확인 가능
Kotlin의 생성자는 주생성자(Primary Constructor)와 부생성자(Secondary Constructor)로 구분된다.
1. 주생성자
Kotlin을 배우면서 느낀점은 Java 개발자가 개발하면서 느꼈던 온갖 귀찮은 작업을 생략하는 언어라는 느낌이다-_-);;;
귀찮은 Java 개발자의 언어랄까......
Java에서는 모든 생성자는 method처럼 선언을 해주어야 한다 하지만 Kotlin에서는 그런 귀찮은 일을 하지 않아도 된다!!
주생성자는 class 선언하면서 생성자를 동시에 정의할 수 있는 기법이다.
방법은 class 이름 옆에 생성자의 parameter를 받고, Property 선언시
해당 값을 이용하여 초기화 해주면 된다.
class Animal(_nLeg:Int, _color:String) {
val nLeg:Int = _nLeg
val color:String = _color
var name:String = "Tom"
fun eat(something:String) {
println("Eat $something")
}
fun cry() {
println("Cry!!!")
}
}
이제 Class를 사용하려면 아래와 같이 주생성자의 인자를 넘겨주어야 한다.
val myAnimal = Animal(4, "yellow")
자 이제 귀찮은 Java 개발자를 위해 한번더 생략!
생성자의 인자도 선언해줘야 하고 Property도 선언해줘야 하는데, 귀찮으니 한방에 쓰자!!!
생성자의 인자를 적어줄때 val, var을 적으면, 해당 인자가 바로 class의 property가 된다.
이 글을 보는 사람이라면 알겠지만 val은 불변, var은 변화가 가능한 Property
class Animal(val nLeg:Int, val color:String) {
var name:String = "Tom"
fun eat(something:String) {
println("Eat $something")
}
fun cry() {
println("Cry!!!")
}
}
예제에서 보다시피 생성자를 통해서 초기화 하기 싫은 변수는 주생성자의 인자로 넣지 않고 따로 선언할 수 있다.
그런데 실제 개발을 하다보면 생성자에서 변수 초기화만 하지 않고 뭔가 로직을 넣어야 하는 상황이 오는데,
주생성자가 Class이름과 함께 정의를 하게된다면...
로직은 어떻게 넣을까???
Kotlin에서는 주생성자의 추가 로직을 위해 init이라고 하는 키워드를 통해 초기화 블록을 제공한다.
class Animal(val nLeg:Int, val color:String) {
var name:String = "Tom"
init {
println("=== Primary Init block ===")
println("nLeg: $nLeg, color: $color, name: $name")
// Do something!!
}
fun eat(something:String) {
println("Eat $something")
}
fun cry() {
println("Cry!!!")
}
}
2. 부생성자
부생성자는 Java의 생성자와 유사하다. 여러개의 생성자를 만들수 있고 생성자에서 어떤 동작을 할지 정의를 해주어야 한다. 부 생성자임을 알려주는 키워드는 constructor
단, 부생성자는 반드시 주생성자와 같이 사용되어야 한다. 부생성자는 주생성자를 호출한다.
class Animal(val nLeg:Int, val color:String) {
var name:String = "Tom"
init {
println("=== Primary Init block ===")
println("nLeg: $nLeg, color: $color, name: $name")
// Do something!!
}
constructor(_nLeg:Int, _color:String, _name:String) : this(_nLeg, _color) {
println("=== Secondary constructor start ===")
this.name = _name
println("=== Secondary constructor end ===")
}
fun eat(something:String) {
println("Eat $something")
}
fun cry() {
println("Cry!!!")
}
}