1. 운영체제 (Operating System) 란?

-컴퓨터 하드웨어 바로 위에 설치되어 사용자 및 다른 모든 소프트웨어와 하드웨어를 연결하는 소프트웨어 계층

-좁은 의미의 운영체제 : 커널(Kernel), 운영체제의 핵심 부분으로 메모리에 상주하는 부분

-넓은 의미의 운영체제 : 커널 뿐만 아니라 각종 주변 시스템 유틸리티 포함한 개념

 

 

2. 운영체제의 목적

2-1) 효율적인 컴퓨터 시스템의 자원 관리

- 프로세서, 기억장치, IO 장치 등의 효율적 관리

 사용자간의 형평성 있는 자원 분배

 주어진 자원으로 최대한의 성능을 내도록

- 사용자 및 운영체제 자신의 보호

 프로세스, 파일, 메시지 등을 관리

2-2) 컴퓨터 시스템을 편리하게 사용할 수 있는 환경 제공

- 하드웨어를 직접 다루는 복잡한 부분을 운영체제가 대행

 

 

3. 운영체제의 분류

3-1) 동시 작업 가능 여부에 따른 분류

- 단일 작업(single tasking) : 한 번에 하나의 작업만 처리

ex) MS-DOS

- 다중 작업(multi tasking) : 동시에 두개 이상의 작업 처리

ex) UNIX, MS windows

 

3-2) 사용자의 수에 따른 분류

- 단일사용자(single user)

ex) MS-DOS, MS Windows

- 다중사용자(multi user) : 동시에 여러명의 사용자가 하나의 컴퓨터에 접속하여 사용, 더 세밀한 자원관리 요구됨

ex) UNIX

 

3-3) 처리 방식에 따른 분류

- 일괄처리(Batch Processing) 

작업 요청의 일정량을 모아서 한 번에 처리 (ex: OMR 카드)

- 시분할(Time Sharing)

여러 작업을 수행할 때 컴퓨터 처리 능력을 일정 시간 단위로 분할하여 사용 (대부분의 OS)

CPU의 시간을 분할하여 나누어 쓴다는 의미

- 실시간(Real Time)

정해진 시간 안에 작업이 반드시 종료되는게 보장되어야 하는 시스템을 위한 OS (반도체/미사일/원자로 등)

※ 실시간 시스템의 개념 확장

Hard realtime system(경성 실시간 시스템) : 시간이 엄밀하게 지켜져야 하는 시스템(ex:미사일)

Soft realtime system(연성 실시간 시스템) : 시간이 지켜져야 하지만 엄격하게 지켜질 필요는 없는 시스템(ex: 영사기)

 

4. 운영체제의 예

- UNIX : 코드 대부분을 C언어로 작성, 높은 이식성, 소스 코드 공개, 프로그램 개발에 용이 

ex) Linux, Solaris

- DOS(Disk Operating System) : MS사가 1981년 개인 PC를 위해 개발, RAM 이 640KB로 제한

- MS Windows : MS 사의 GUI 기반 운영체제

 

 

※ 이화여대 반효경 교수님의 운영체제 강의내용 정리 (kocw.net)

반응형

1. mysql-server 설치

>sudo apt-get update  //apt-get 업데이트

>sudo apt-get install mysql-server  //mysql-server 설치

 

2. /etc/mysql/ 밑의 conf 에서

binding ip 0.0.0.1 로 수정하여 외부에서도 접속 가능토록 수정

 

3. 실행 및 종료

>sudo /etc/init.d/mysql restart //재시작

>sudo systemctl start mysql //시작

>sudo systemctl enable mysql //서버 재시작시 mysql 자동 시작되도록 등록)

>sudo systemctl stop mysql

 

4. 유저 관리 및 DB 권한 주기

3-1) 데이터베이스 생성

>mysql -u root -p //root 로 접속

>CREATE DATABASE bootmybatis; //bootmybatis 이름으로 database 생성

>SHOW DATABASES; //databases 목록 조회

※ 유저 삭제

>DROP DATABASE dbname;

 

3-2) 유저 생성 및 접근 허용 IP 지정

>CREATE USER 'developyo'@'%' IDENTIFIED BY 'password';

//암호를 'password'로 하는 developyo 계정을 생성, 해당 사용자는 어떤 ip 에서도('%') 접속이 가능

>ALTER USER ''root'@'localhost' IDENTIFIED BY 'password';

//암호를 'password'로 하는 root 계정을 수정, 해당 사용자는 localhost에서만 접속이 가능

>FLUSH PRIVILEGES;  //commit

>SELECT user, host, password FROM mysql.user; //유저, 접근허용ip, 암호 확인

※ 유저 삭제

>DROP USER 'id'@'host';

 

3-3) 데이터베이스에 권한 부여

>GRANT ALL PRIVILEGES ON bootmybatis.* to developyo@'%';

>FLUSH PRIVILEGES;  //commit

>SHOW GRANTS FOR 'developyo'@'%'; //developyo 갖고있는 권한 확인

 

 

[호스트(window)에서 vm 게스트(우분투) mysql 에 접속하기]

1) NAT 설정 브릿지로 바꾸기

설정(settings) > 네트워크(network) > 다음에 연결됨 : 어댑터에 브리지 (attached to: Bridged Adapter) 로 변경

2) 터미널에서 ip 확인

>ifconfig 

3) mysql client 에서 위의 ip로 연결

 

참고 :

https://dejavuqa.tistory.com/317

https://bugwhale.com/virtualbox-bridged-adapter-error/

 

반응형

람다의 메소드 참조

메소드 참조는 매개변수의 정보 및 리턴 타입을 알아내어 람다식에 불필요한 매개 변수를 제거하기 위함

 

[기본문법]

https://developyo.tistory.com/190

 

[메소드참조]

1. static 메소드참조

public static int abs(int a){}   //Math class 내의 abs()
Math::abs  //위와 같다

Math.abs(..)와 같은 static 메소드를 Math::abs 로 표현 할 수 있다.

※ Math::abs()와 같이 ()를 붙이지 않는것을 주의.

 

위와 같은 람다의 static 메소드 참조를 사용하여 인터페이스를 구현할 경우

아래와 같이 static 메소드를 리턴하도록 구현 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package Java.Lamda.methodReferences;
 
public class MethodRef_1_Basic {
 
    public static void main(String[] args){
        
        /** 1.기본 사용법 */
        //String.valueOf() 를 그대로 사용하여 리턴하는 람다
        FuncI funcI = (Object obj) -> String.valueOf(obj);
        System.out.println(funcI.anony("HELLO"));
        
        //위 경우 아래와 같이 메소드 참조가 가능
        FuncI funcI_ref_method = String::valueOf;
        System.out.println(funcI_ref_method.anony(100));
        
        //절대값을 구해주는 Math.abs 를 참조 
        System.out.println("abs ref : "+convert(-1, Math::abs));
    
    }
 
    @FunctionalInterface
    interface FuncI {
        String anony(Object obj);
    }
    
    @FunctionalInterface
    interface MathAbs {
        int anony(int obj);
    }
    
    public static int convert(int number, MathAbs func) {
        return func.anony(number);
    }
}
cs

[실행결과]

HELLO
100
abs ref : 1

 

2. 생성자 참조

() -> new String()    
String::new           //위와 같다

위와 같이 생성자를 리턴하는 경우 타입::new 와 같이 표현 할 수 있다.

아래는 생성자 참조를 이용한 예제.

[Person.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package Java.Lamda.methodReferences;
 
public class Person {
    
    private String name;
    private String gender;
 
    public Person() {
    }
    public Person(String name) {
        this.name=name;
    }
    public Person(String name, String gender) {
        this.name=name;
        this.gender = gender;
    }
 
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
 
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}
 
cs

[클라이언트]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package Java.Lamda.methodReferences;
 
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
 
public class MethodRef_2_Constructor {
 
    public static void main(String[] args){
 
        Func<String, Person> func1 = Person::new;
        Person person = func1.create("pyo");
        System.out.println(person.getName());
        
        Func2<StringString, Person> func2 = Person::new;
        Person person2 = func2.create("pyo""male");
        System.out.println(person2.getName() + "/" + person2.getGender());
 
    }
    
    @FunctionalInterface
    interface Func<T, R>{
        R create(T t);
    }
    @FunctionalInterface
    interface Func2<T, U, R>{
        R create(T t, U u);
    }
}
 
cs

위의 Func<T, R>, Func2<T, U, R>과 비슷한 역할을 하는

Function<T, R>, BiFunction<T, U, R> functionalInterface가 java.util 패키지로 제공된다.

[실행결과]

pyo
pyo/male

 

3. 인스턴스 참조

()->a.toString();
a::toString        //위와 같다

위와 같이 인스턴스의 메소드를 리턴하는 경우 인스턴스::메소드 와 같이 표현 할 수 있다.

아래는 인스턴스 참조를 사용한 예.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package Java.Lamda.methodReferences;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
 
public class MethodRef_4_Instance {
 
    public static void main(String[] args){
        Person person = new Person("pyo");
        Func func = person::getName;
        System.out.println(func.anony());
        
    }
    
    @FunctionalInterface
    interface Func {
        String anony();
    }
}
 
cs

 

참고:

https://futurecreator.github.io/2018/08/02/java-lambda-method-references/

https://imcts.github.io/java-method-reference/

 

반응형

'back > java' 카테고리의 다른 글

HttpUrlConnection 모듈 (리펙토링) : 빌더패턴과 프록시패턴 사용  (0) 2020.02.21
[Java] java reflection  (0) 2020.02.20
[Java] lambda 람다 1 (기본문법)  (0) 2020.01.15
[Java] Generic 제네릭  (0) 2019.12.28
[Java] Compile  (0) 2019.12.22

 

"소프트웨어 장인정신"

소프트웨어 장인정신은 소프트웨어 개발자가 스스로가 선택한 커리어에 책임감을 가지고, 지속적으로 새로운 도구와 기술을 익히며 발전하겠다는 마음가짐이다. 소프트웨어 장인정신은 책임감, 프로페셔널리즘, 실용주의 그리고 소프트웨어 개발자로서의 자부심

 

"애자일"

: 단일 개념이 아닌 서로 다른 여러 맥락에 따른 방법론과 테크닉의 조합

: 짧은 피드백 주기의 중요성

 

"카타"

: 품세라는 뜻으로 일본 무예 훈련에서 나온 용어

: 작은 훈련용 코딩

 

"펫 프로젝트"

: 자가 학습/훈련 용 프로젝트

 

"어디로 가고있지 모르고 있다면 결국 가고싶지 않은 곳으로 간다"

: 방향의 중요성

: 방향을 잡기위한 자기계발

 

"나쁜 코드는 암과도 같다"

: 리펙토링의 중요성

: TDD의 중요성

 

 

2020.02.01

반응형

jdk 1.8 이상부터 지원.

함수형 프로그래밍을 가능케 함.

1회용 익명 클래스가 필요할 때 람다를 사용하여 코드를 줄일 수 있음.

 

[기본 문법 1 : 인수가 없는 경우]

접근제한자, 리턴타입 생략 가능

public void method(){
}

() -> {
}

* @FunctionalInterface : 추상메소드가 한개만 존재하는 인터페이스

* lambda는 Functional Interface 에만 사용이 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package Java.Lamda.basic;
 
public class Main1 {
        
    public static void main(String[] args) {
 
        //기존방법대로 익명클래스를 사용한 구현
        Interface i = new Interface() {
            @Override
            public void sayHello() {
                System.out.println("HELLO! in anonymous class");
            }
        };
        i.sayHello();
        
        //lambda를 사용한 익명클래스 구현        
        //lambda 는 Functional Interface 에만 사용이 가능
        Interface lamda = () -> {
            System.out.println("HELLO! in anonymous method(lambda)");
        };
        lamda.sayHello();
    }
    
    //@FunctionalInterface 는 abstract method 가 오직 1개여야 한다.
    @FunctionalInterface
    interface Interface {
        void sayHello();
    }
}
 
cs

[결과]

HELLO! in anonymous class 
HELLO! in anonymous method(lambda)

 

[기본 문법 2 : 인수가 존재하는 경우]

인수 타입 생략이 가능.

return 생략 가능(함수 내 처리가 return 문이 전부인 경우)

public void method(int x, int y){
   return x+y;
}

(x, y) -> x+y;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package Java.Lamda.basic;
 
public class Main3 {
    
    public static void main(String[] args) {
        
        Calculation add = (x, y) -> {
            return x+y;
        };
        System.out.println(calculate(add23));
        
        
        Calculation multiply = (x, y) -> x*y;
        System.out.println(calculate(multiply, 23));
    }
    
    static Integer calculate(Calculation operation, Integer x, Integer y) {
        return operation.apply(x, y);
    }
    
    @FunctionalInterface
    interface Calculation {
        Integer apply(Integer x, Integer y);
    }
    
    class Calculator {
        Integer add(Calculation cal, Integer x, Integer y) {
            return cal.apply(x, y);
        }
    }
}

 

 

cs

[결과]

5
6

 

[기본 문법 3 : static 메소드, default 메소드]

jdk 1.8 부터 interface 에서 static 메소드, default 메소드 사용이 가능.

static 메소드 : 오버라이딩 불가
default 메소드 : 오버라이딩 가능

인터페이스에 메소드라니?!

추상메소드만 가질 수 있는게 아니라니?!

인터페이스가 메소드(default 메소드)를 가질 수 있게 되면서, 추상클래스와 인터페이스가 매우 비슷해졌다.

(인터페이스를 만들 때, 공통 관심사는 default 메소드로, 나머지 메소드를 abstract 메소드로 선언하면 기존의 추상클래스와 매우 비슷하다)

자바에서도 결국 다중상속이 가능하게 된 셈이다.

그렇다면 추상클래스와 인터페이스의 차이점은 이제 더이상 없는건가?

아직 아래와 같은 차이점이 존재한다.

추상클래스 : 다중상속이 불가, 인스턴스 변수를 가질 수 있다
인터페이스 : 다중구현이 가능, 인스턴스 변수를 가질 수 없다

Calculation : interface

ExtendsCalculation : Calculation interface 상속받은 interface

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package Java.Lamda.basic;
 
public class Main4 {
 
    public static void main(String[] args) {
 
        Calculation add = (x, y) -> {
            return x+y;
        };
        add.print(23);
        Calculation.print2(23);
        System.out.println(calculate(add23));
        
        
        ExtendsCalculation multiply = (x, y) -> x*y; 
        multiply.print(23);
        System.out.println(calculate(multiply, 23));
        
    }
    
    static Integer calculate(Calculation operation, Integer x, Integer y) {
        return operation.apply(x, y);
    }
    
    @FunctionalInterface
    interface Calculation {
        Integer apply(Integer x, Integer y);
        
        default void print(Integer x, Integer y) {
            System.out.println("x : " + x);
            System.out.println("y : " + y);
        }
        
        static void print2(Integer x, Integer y) {
            System.out.println("x : " + x + ", y : " + y);
        }
    }
    
    class Calculator {
        Integer add(Calculation cal, Integer x, Integer y) {
            return cal.apply(x, y);
        }
    }
    
    @FunctionalInterface
    interface ExtendsCalculation extends Calculation{
        @Override
        default void print(Integer x, Integer y){
            System.out.println("x,y : " + x +","+ y);
        }
    }
    
}
 
cs

[결과]

x : 2
y : 3
x : 2, y : 3
5
x,y : 2,3
6

※ stackoverflow 및 각종 개발자 커뮤니티 QnA 에 Comparator Interface 구현시 람다를 어떻게 사용할 수 있냐는 질문이 꽤 많이 보인다.

1.8 에서의 Comparator 인터페이스를 들여다 보면, default 메소드 및 static 메소드 다수 존재하나 추상메소드는 오직 compare()메소드, 단 한 개 존재한다.

 

[메소드 참조]

https://developyo.tistory.com/193?category=688588

 

 

참고:

https://futurecreator.github.io/2018/07/20/java-lambda-type-inference-functional-interface/

 

반응형

'back > java' 카테고리의 다른 글

[Java] java reflection  (0) 2020.02.20
[Java] lambda 람다 2 (메소드참조)  (0) 2020.01.17
[Java] Generic 제네릭  (0) 2019.12.28
[Java] Compile  (0) 2019.12.22
[Java] Collection Framework  (0) 2019.12.21

시퀀스다이어그램/플로우차트 그리기 좋은 툴 :

무료

1. bizagi

2. https://www.draw.io/

3. https://www.websequencediagrams.com/

 

YAML file 규격 확인 

4. YAMLlint : www.yamllint.com/

 

반응형

1. git 저장소 만들기

1) git으로 관리할 (github에 올릴) 소스가 위치한 workspace 로 이동 

2) git init

※ git init 시 .git 폴더 생성되며 환경설정 (config) 파일 등이 생성됨

 

1-1. git 사용자 계정 정보 설정하기

> git config user.name "develo-pyo"

> git config user.email "jungpyo9@gmail.com"

.git/config 파일 직접 수정해도 된다 (참고)

 

2. 인덱스에 추가하기

- 추가한 파일 인덱스에 추가 : git add hellogit.java

- 제거한 파일 인덱스에 추가 : git rm hellogit.java

 

3. 인덱스 커밋하기

- 인덱스 커밋 : git commit -m "commit comment"

 

4. 원격서버 추가하기

새로운 원격서버 추가 : git remote add origin "https://github.com/develo-pyo/~.git"

이때 git repository 주소는

git hub 접속 > git repository new > 프로젝트명(경로) 작성시 나타나는 아래 화면에서 확인할 수 있다.

 

5. 원격서버에 푸시하기

- 마스터에 푸시 : git push origin master

 

참고 : https://rogerdudler.github.io/git-guide/index.ko.html

 

 

 

반응형

드래그앤드롭 설정을 양방향으로 했음에도 불구하고

호스트<>게스트간 복사붙여넣기가 되지 않을 경우

 

1. 저장소>컨트롤러:IDE >iso 이미지를 VBoxGuestAdditions.iso 로 변경

2. 우분투 실행 후 VBox_GAs_~ 클릭 후 폴더창 우측 상단의 프로그램 실행 버튼 클릭

3. 현재상태 저장 후 재시작

 

참고:

https://3dmpengines.tistory.com/1943

반응형

본 포스팅은 '기억보단 기록'을 이라는 타이틀로 유명한 'jojoldu' 님의 인덱스관련 포스팅을 공부차원에서 단순 요약한 포스팅에 불과하므로,

보다 정확한 정보 습득을 원하시는 분들은 필히 아래 링크로 이동 하시길 바랍니다.

https://jojoldu.tistory.com/243

 

[인덱스 기준]

1. 카디널리티가 높은 --> 낮은 칼럼 순서로 인덱스를 잡아야 좋다.

카디널리티가 높다 : 중복수치가 낮다 ex) 주민등록번호

카디널리티가 낮다 : 중복수치가 높다 ex) 이름

 

2. 인덱스를 잡을 때 키의 길이는 짧을 수록 좋다.

InnoDB(MySQL)에서 디스크에 데이터를 저장하는 가장 기본단위를 페이지라 하며, 인덱스 역시 페이지 단위로 관리된다.

인덱스가 저장되는 페이지는 16KB 크기로 고정되어 있다.

키의 크기가 길 수록 페이지에 저장되는 인덱스의 양은 줄어들고,

페이지에 저장된 인덱스의 양이 줄어들 수록, 조회시 더 많은 페이지를 조회해야 한다.

 

 

[인덱스 사용한 조회]

1. 복수개의 칼럼으로 인덱스를 구성했을 때, 조건절 주의사항

인덱스를 회원그룹(group), 나이(age), 성별(gender)  과 같이 잡았을 때,

아래의 쿼리는 인덱스(age)를 타지 않음

select *
from user
where age = 18

반면, 아래의 쿼리는 인덱스(group)를 탄다.

select *
from user
where group='premium'

: 첫번째 인덱스 칼럼은 조회조건에 포함되어야만 한다.

 

2. 그 외의 주의사항

1) between, like, <, > 등의 범위 조건에 사용된 칼럼은 인덱스를 타지만, 그 뒤의 인덱스 칼럼들은 인덱스로 사용되지 않음.

아래 쿼리에서 gender는 인덱스로 사용되지 않는다.

* LIKE 의 경우 'str%' 좌측 일치 패턴만 인덱스가 사용된다.

select *
from user
where group = 'premium'
and age > 18
and gender = 'M'

2) =, IN 조건으로 사용된 칼럼 뒤의 인덱스 칼럼들은 인덱스로 사용된다.

(IN은 =을 여러번 실행 시킨 것이므로)

단, IN 조건 안에 서브쿼리를 넣게 되면 성능상 이슈가 발생. (서브쿼리 외부 먼저 실행 후 IN 구절은 체크조건으로 실행되므로)

 

3) AND 연산자는 ROW 수를 줄이는 역할을 하지만 OR 연산자는 비교해야할 ROW가 더 늘어나므로 풀 테이블 스캔이 발생할 확률이 높음. 

 

4) 인덱스로 사용된 컬럼은 컬럼값 그대로 사용해야 인덱스가 사용된다.

select *
from user
where group = 'premium'
and age+1 = 18

위 쿼리는 인덱스를 타지 못한다.

위 경우, age = 18-1 과 같이 수정해야 한다.

칼럼이 문자열인데 숫자로 조회시 타입이 달라 인덱스가 사용되지 않는다.

 

5) null의 경우 where ? is null 로 인덱스 사용이 가능

일반적인 DBMS 와 달리 Mysql 에선 null 값도 인덱스로 관리

 

 

[인덱스 사용한 조회시 조회 칼럼 순서]

조회조건에 포함되어 있는지가 중요할 뿐, 반드시 인덱스 순서와 조회 칼럼 순서를 지킬 필요는 없다.

(옵티마이저가 조회 칼럼 순서를 인덱스 칼럼 순서에 맞춰 재배열 하는 과정이 추가되긴한다)

 

반응형

Stack 두 개(First In First Out)로 Queue(Last In First Out) 구현하기

 

스택 두 개를 다음과 같은 용도로 분리하여 사용.

inStack : 데이터를 저장

outStack : 데이터를 꺼낼 때 임시 버퍼로 사용

 

[Queue.class]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package algo_datastructure.stack.queuebystack;
 
import java.util.Stack;
 
class Queue <T> {
    
    private Stack<T> inStack;
    private Stack<T> outStack;
    
    public Queue(){
        inStack = new Stack<T>();
    }
    
    public boolean add(T input) {
        return inStack.add(input);
    }
    
    public T poll() {
        if(!inStack.isEmpty()) {
            outStack = new Stack<T>();
        }
        while(!inStack.isEmpty()) {
            outStack.add(inStack.pop());
        }
        T topItem = outStack.pop();
        while(!outStack.isEmpty()) {
            inStack.add(outStack.pop());
        }
        return topItem;
    }
    
    public T peek() {
        if(!inStack.isEmpty()) {
            outStack = new Stack<T>();
        }
        while(!inStack.isEmpty()) {
            outStack.add(inStack.pop());
        }
        T topItem = outStack.peek();
        while(!outStack.isEmpty()) {
            inStack.add(outStack.pop());
        }
        return topItem;
    }
    
    public boolean isEmpty() {
        return inStack.isEmpty();
    }
    
}
 
cs

[poll() 메소드 설명]

1. 데이터 입력

add(1);

add(2);

add(3);

inStack
3
2
1

2. poll(); 호출

if(!inStack.isEmpty()) {
   outStack = new Stack();
}

inStack outStack
3  
2  
1  

while(!inStack.isEmpty()) {
   outStack.add(inStack.pop());
}

inStack outStack
  1
  2
  3

T topItem = outStack.pop();   //1

inStack outStack
   
  2
  3

while(!outStack.isEmpty()) {
   inStack.add(outStack.pop());
}

inStack outStack
   
3  
2  

 

[사용]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package algo_datastructure.stack.queuebystack;
 
public class Main {
 
    public static void main(String[] args) {
        
        Queue<Integer> q = new Queue<>();
        q.add(1);
        q.add(2);
        q.add(3);
        System.out.println("peek : "+q.peek());
        System.out.println("poll : "+q.poll());
        
        q.add(4);
        System.out.println("peek : "+q.peek());
        while(!q.isEmpty()) {
            System.out.println("poll : "+q.poll());
        }
        
    }
    
}
 
cs

[실행결과]

peek : 1
poll : 1
peek : 2
poll : 2
poll : 3
poll : 4

기술면접에서 단골 문제라고 하길래, 이렇게 구현하면 되지 않을까 하고 구현해보았습니다..

반응형

+ Recent posts