221026 Stack
1.Stack : List 구조
데이터 삽입 : push
값이 삽입되면 top이 내려가고 top의 위치에 데이터를 삽입.
데이터 가져오기 : pop -Top 위치의 데이터를 삭제하고 가져옴
pop을 하면 top의 위치가 올라감
※TOP의 위치에서만 저장되고 꺼내짐
Last In First Out
-Underflow : 데이터가 없는데 pop을 한 것 =>예외 발생
-Overflow : 더 이상 저장할 공간이 없는데 push를 한 것
용도 : 함수의 데이터를 저장할 때 사용
Stack은 자바에서 클래스로 제공합니다.
package java_1026.Stack.Ex;
import java.util.Date;
//여러 개의 값을 묶어서 표현하기 위한 클래스 - Value Object(VO)
//getter와 constructor는 만들지만 setter는 만들지 않는 경우가 많음
public class PersonVO {
//번호, 이름, 생일, 전화번호를 저장
private long num;
private String name;
private Date birthday;
private String phonenumber;
//매개변수가 없는 생성자 - default Constructor
//NoArgsConstructor라고도 함
public PersonVO() {
super();
}
//매개변수가 전부 있는 생성자-AllAgsConstructor
public PersonVO(long num, String name, Date birthday, String phonenumber) {
super();
this.num = num;
this.name = name;
this.birthday = birthday;
this.phonenumber = phonenumber;
}
//Immutable Data를 만드는 방법. setter가 없으니 바꿀수가 없다.
public long getNum() {
return num;
}
public String getName() {
return name;
}
public Date getBirthday() {
return birthday;
}
public String getPhonenumber() {
return phonenumber;
}
//값을 빠르게 확인하기 위한 메서드
//디버깅을 위한 메서드 - 개발 과정 중 값을 확인하기 위한 목적, 개발이 끝나면 불필요한 메서드이다
@Override
public String toString() {
return "PersonVO [num=" + num + ", name=" + name + ", birthday=" + birthday + ", phonenumber=" + phonenumber + "]\n"
+ "";
}
}
setter가 없으면 값을 바꿀 수 없고 getter만 가져오면 조회가 가능=>immutable data 만드는 법!
Main
package java_1026.Stack.Ex;
import java.util.Date;
import java.util.Stack;
public class MainClass {
public static void main(String[] args) {
//PersonVO 클래스의 인스턴스를 저장할 수 있는 stack을 생성
Stack<PersonVO> stack = new Stack<>();
stack.push(new PersonVO(1, "카리나", new Date(100, 3, 11), "01011112222"));
stack.push(new PersonVO(2, "민지", new Date(103, 7, 24), "01033334444"));
System.out.println(stack.toString());
//Stack에서 데이터 꺼내기
System.out.println(stack.pop());//민지가 나옴. 마지막에 넣은 게 먼저 나온다
System.out.println(stack.pop());//카리나가 나옴.
System.out.println(stack.pop());//stack이 비어있다고 예외가 뜸-underflow
//데이터가 2개 존재해서 2번 pop을 하면 모두 제거된상태.
//그런데 또 pop을 수행했기 때문에 Underflow가 발생한 것.
}
}
[PersonVO [num=1, name=카리나, birthday=Tue Apr 11 00:00:00 KST 2000, phonenumber=01011112222]
, PersonVO [num=2, name=민지, birthday=Sun Aug 24 00:00:00 KST 2003, phonenumber=01033334444]
]
PersonVO [num=2, name=민지, birthday=Sun Aug 24 00:00:00 KST 2003, phonenumber=01033334444]
PersonVO [num=1, name=카리나, birthday=Tue Apr 11 00:00:00 KST 2000, phonenumber=01011112222]
Exception in thread "main" java.util.EmptyStackException
at java.base/java.util.Stack.peek(Stack.java:101)
at java.base/java.util.Stack.pop(Stack.java:83)
at java_1026.Stack.Ex.MainClass.main(MainClass.java:17)
stack이 2번인데 pop을 3번 하면, 3번째에서 underflow가 발생함.
/*
stack 영역 -함수, 메서드, {}
stack 영역에 만든 걸 local variable(매개변수)라고 함. 거길 벗어나면 사용할 수 없다. stack은 자기 영역이 끝나면 소멸되기 때문
Heap 영역
-1.개발자가 사용하는 영역
-2.static한 영역 -여기에 한번 만들면 절대로 못고침
인스턴스는 1에, 클래스와 상수는 2에.
스택에서 힙으로 갈 떄 => .과 {}를 사용
인스턴스는 변수가 없으면 사용할 수 없음. stack은 영역이 끝나야 없어지고, static은 프로그램이 끝나야 없어짐. but 인스턴스 영역은 없엘 수 있음
=>null을 대입하면 됨. garbage collection이 알아서 소멸시킴.
*/