JAVA

221026 Stack

주영재 2022. 10. 26. 13:40

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이 알아서 소멸시킴.
*/