자바로 Stack을 재현하는 것을 학교에서 배워왔다.
Stack은 먼저 쌓인 데이터가 마지막에 꺼낼 수 있고 마지막에 쌓은 데이터를 먼저 꺼낼 수 있는 "책을 쌓아놓은 구조" 이다.
근데 수업을 들을 때는 이해가 안되서 다시 코드를 타이핑하면서 공부하기로 한다!
package practice;
public interface StackInterface {
int length(); //스택에 들어있는 문자열 개수 리턴
String pop(); //현재 스택의 값을 리턴
boolean push(String ob); //현재 스택에 데이터 추가
}
1. interface 생성
interface를 왜 구현하는지는 Main문에 자세하게 설명되어있다.
글쓴이도 아직 완벽하게 이해하지는 못했지만 다형성 때문에 중요한 것 같다.
length() : 스택에 들어가 있는 문자열 개수 리턴하는 클래스
pop() : 현재 스택의 값을 리턴하는 클래스
push() : 현재 스택에 데이터 추가하는 클래스
나중에 interface를 구현하기 위해서는 length(), pop() , push()라는 메소드를 모두 만들어 주어야 한다.
2. Stringstack 클래스 생성(기능 구현)
package practice;
public class StringStack implements StackInterface{
private String[] element; //변수 값.
private int index; //주소 값.
public StringStack(int capacity)
//StringStack이라는 메소드는 int 값을 받아서 capacity 변수에 넣어 사용할 수 있다.
{
element = new String[capacity];
index = 0; //앞으로 들어갈 배열의 인덱스 값.
}
public int length()
//현재 크기 리턴.
{
return index; //배열의 길이 return.
}
public String pop()
//배열에 있는 데이터를 꺼내감.
{
if(index==0) //스택이 비어 있음.
return null;
index--; //스택 포인터 감소.
return element[index];
}
public boolean push(String ob)
{
if(index == element.length) //현재 배열의 길이가 한계치와 같으면 true를 리턴.
return false;
element[index++] = ob;
return true;
}
}
length() , pop() , push() 메소드 기능을 구현한 클래스이다.
3. StackManager Main 메소드 생성
package practice;
import java.util.*;
public class StackManager {
public static void main(String[] args) {
StringStack stack = new StringStack(10);
StackInterface s = stack;
//StringStack이 StackInterface를 구현 받았기 때문에 stack을 위와 같이 사용 가능.
//이러면 StackInterface에 있던 length(),pop(),push()만 사용가능하다. 다른 메소드는 없지만...
//StackInterface stack = new StringStack으로 사용하지 않는 이유는 초기 값을 지정할 수 없게 되기 때문이다.
Scanner Input = new Scanner(System.in);
System.out.println(">>");
for(int i=0;i<5;i++)
{
String text = Input.next();
//텍스트 입력을 받음 x5
s.push(text);
// push 클래스로 text값을 스택에 저장함.
}
int count = s.length();
// count 변수에 스택의 길이를 저장.
for(int i=0;i<count;i++)
{
System.out.println(s.pop()+" ");
// 스택에 저장된 데이터 갯수 만큼 출력.
}
Input.close();
}
}
StringStack stack = new StringStack(10);
- StringStack의 형태인 stack 변수를 만들고 StringStack(10) 클래스를 저장.
이때 capacity 값으로 10이 들어가고 element 배열은 [10]의 크기를 갖는다.
StackInterface s = stack;
- 여기서 stack을 왜 StackInterface의 형태를 가진 s에 넣을까?
이런 식으로 해주면 StackInterface에서 구현해야만 하는 메소드들만 "s.메소드명" 하고 사용할 수 있기 때문이다.
만약 휴대폰을 가지고 있는데 동생들에게 게임만 할 수 있도록 하고 싶다는 것을 자바로 구현하면
public interface Game{
void Game();
}
public class Cellphone_Function implements Game //휴대폰의 기능들
{
public void Game() ---
public void Call() ---
public void Camera() ---
}
public class Cellphone
{
public static void main(String[] args)
{
Game permission = new Cellphone_Function();
permission.Game();
// 휴대폰의 또 다른 기능인 Call과 Camera는 사용하지 못한다. 왜냐하면 interface Game에는 Game() 만 구현되있기 때문이다.
}
}
for 문으로 총 5번 입력(push)을 받고 5번 출력(pop)을 한다.
'전공 > 자바' 카테고리의 다른 글
[자바] Main문의 String[] args 출력해보기 (0) | 2019.11.28 |
---|---|
[자바] StringTokenizer 클래스 사용법 (0) | 2019.11.28 |
[퍼옴]자바 타이머 사용 방법 (0) | 2019.11.21 |
[자바 자습]객체 공부 (0) | 2019.10.08 |