no image
JAVA: 알고리즘, APS, 시간복잡도
알고리즘이란?어떠한 문제를 해결하기 위해 수행해야 하는 절차나 방법을 말한다.  APS(Algorithm Problem Solving)말 그대로 알고리즘 문제를 해결하는 것. 문제 해결능력을 기를 수 있다!    좋은 알고리즘 기준정확도 : 정확한 결과가 출력되는가? 얼마나 정확하게 동작하나? 실행속도(작업량): 적은 연산으로 문제를 해결할 수록 실행속도가 빠르다.메모리 사용량: 적은 메모리를 사용할수록 컴퓨팅 자원을 아낄 수 있다.가독성: 다른 사람이 이해하기 쉽도록 단순해야 한다.최적성: 더 이상 개선의 여지가 없는가?     알고리즘을 나타내는 방식 2가지 의사코드(pseudo code)특정 언어에 관계 없이 쉽게 이해할 수 있도록 나타내는 코드.정해진 규칙이 없이 이해만 잘 되면 됨.   순서도그..
2024.08.04
no image
JAVA : UML 클래스 다이어그램
UML: Unified Modeling Language. 모델을 만들기 위한 표준 언어다른 사람들과 의사소통할 떄 사용시스템의 구조, 클래스 의존성 등 파악건축도면과 같은 느낌크게 2가지 유형(구조 다이어그램, 행위 다이어그램)이고, 유형 별 7개 씩 총 14개의 세부 다이어그램 존재함.클래스 다이어그램은 구조 다이어그램에 속한다!   클래스 다이어그램프로그램의 구조를 그림으로 표현한 것.기본 구성요소는 클래스, 속성, 메서드, 관계인터페이스는 > 추가추상클래스는 >추가 or 이탤릭체로 표기         접근제어자표시범위private-본인 클래스만 접근 가능public+어떤 클래스에서든 접근 가능protected#동일 패키지 or 상속받은 클래스만 접근 가능(default)~동일 패키지만 접근 가능
2024.07.21
no image
JAVA : 상속
상속이란상위 클래스의 속성(=멤버변수)과 메서드(멤버메서드)를 물려 받아 자식 클래스를 정의하는 것상위 클래스가 쓰던 것을 그대로 쓰는데, 거기에 더 확장하고 차별화를 두고 싶을 때 사용상위, 부모, super클래스 자동차 / 개 / 사람      상속의 특징확장성, 재사용성: 자동차 리스트를 관리하는데, 별개로 세단과 전기차, 버스 등을 별도로 관리하고 싶다면?                              자동차의 속성을 그대로 가져가면서도 버스, 수용인원 등의 별도 속성을 관리할 수 있도록                              상속을 활용하여 하위 클래스를 생성할 수 있다.자식 클래스는 부모 클래스의 멤버 변수와 메서드들을 마치 본인이 선언한 것처럼 사용이 가능extends 키워..
2024.07.21
no image
JAVA: JVM 메모리 구조, static, 접근제어자
JVMJava Virtual Mahine - 자바 가상 머신OS에 상관 없이 실행할 수 있도록 만들어주는 역할메서드영역 (method Area) : 클래스, 인터페이스 관련한 정보를 저장하는 영역힙 영역 (heap Area) : 설계도를 통해 만들어진 객체와 그 문자열, 배열 등이 저장되는 영역스택 영역 (stack Area) : 메서드를 호출할 때마다 프레임이 생성되고, 지역변수 등도 함께 임시 저장됨. 해당 메서드가 종료되면 하나씩 사라지는 방식. LIFO 방식(Last In First Out)       static구분staticnon-static 구동 시점클래스가 메서드 영역에 로딩될 때 생성일반 멤버변수이므로, new 키워드 쓸 때(객체 생성할 떄) 만들어짐메모리 할당오직 1개의 메모리 공간 할..
2024.07.18
no image
JAVA: 객체, 클래스, 생성자, 객체지향 프로그래밍(OOP)
객체(국어사전) 의사나 행위가 미치는 대상, 문장 내에서 동사의 행위가 미치는 대상프로그래밍에서는? 데이터와 관련한 알고리즘을 하나의 단위로 묶은 것    객체지향 프로그래밍객체 단위로 묶어 코드를 작성함으로써, 객체 간 상호작용을 활용하는 프로그래밍 방법추상화: 객체의 세부사항을 숨기고 필요한 기능만을 제공함다형성: 상속 관계에서 각 객체가 서로 다른 방식으로 작동하도록 함상속: 기존 클래스를 새로운 클래스가 상속받음으로써 재사용 및 확장이 가능캡슐화: 데이터와 메서드를 하나로 캡슐화함으로써 객체 데이터 등을 숨겨 보안에 강화  >>> 코드의 유지보수, 재사용성, 유연성이 커진다는 장점  클래스객체를 만들기 위한 설계도설계도를 만들어두면, 그 설계도대로 객체들을 만들어낼 수 있다.인스턴스: 클래스를 통..
2024.07.17
자바: Map 클래스, 자주 쓰는 메서드
Map(맵) 인터페이스키-값 쌍을 저장데이터 검색에 효율적이기에 자주 사용키 중복 불가능, 키와 값은 1대1로만 매치     Map(맵) 클래스 데이터 읽기 성능 : HashMap > LinkedHashMap > TreeMap > HashTable종류HashMapTreeMapLinkedHashMapHashTable동기화 여부비동기화비동기화비동기화동기화정렬 순서없음key값에 따라 정렬없음없음삽입 순서 유지없음없음삽입 순서 유지없음null 허용키-값 둘 다 허용값만 허용키-값 둘 다 허용허용 X성능평균 O(1)평균 O(log n)평균 O(1)평균 O(1)      자바에서 큐의 주요 메서드put(K key, V value): 지정된 키와 값을 맵에 추가get(Object key): 지정된 키와 연결된 값을 ..
2024.06.04
자바: Queue(큐)
Queue(큐)데이터의 순서를 유지, 가장 먼저 들어온 데이터가 가장 먼저 나가는 자료 구조(선입선출 = FirstInFirstOut)줄 서기, 인쇄 작업 처리, 프로세스 관리 등에서 사용  자바에서 큐의 주요 메서드add(요소값): 큐의 끝에 요소를 추가 (큐가 다 차면 예외 발생)offer(요소값): 큐의 끝에 요소를 추가 (큐가 다 차면 false 반환)remove(): 큐의 앞에서 요소를 제거하고 반환 (비어있으면 예외 발생)poll(): 큐의 앞에서 요소를 제거하고 반환 (비어있으면 null 반환)element(): 큐의 앞에 있는 요소를 반환 (비어있으면 예외 발생)peek(): 큐의 앞에 있는 요소를 반환 (비어있으면 null 반환)isEmpty(): 큐가 비어있는지 확인 (true / fa..
2024.06.02
자바: StringTokenizer 사용법, split과의 차이
StringTokenizer??문자열을 원하는 구분자로 나누어 토큰으로 분리할 때 사용java.util 패키지에 속해 있음기본은 공백 기준으로 쪼개준다  사용법1. 기본 구분 (공백으로 구분) String str = "Java is fun"; StringTokenizer st = new StringTokenizer(str); while (st.hasMoreTokens()) {     System.out.println(st.nextToken()); }     // 출력: Java   is   fun    2. 원하는 구분자로 구분두 번째 매개변수로 원하는 구분자를 입력하면 해당 구분자를 기준으로 쪼개준다.String str = "Java, is, fun"; StringTokenizer st = new St..
2024.05.29
no image
자바: BufferedReader , Scanner
입력을 처리하는 방법 중 가장 많이 사용되는 클래스가BufferedReader, Scanner이다. BufferedReader, Scanner 특징BufferedReader- 입력을 버퍼링 하여 빠르게 읽음- readLine()을 사용해 한 줄씩 읽을 수 있음- 멀티스레드 환경에서 안전하게 사용 가능 Scanner- 사용 비교적 간편- 문자열 뿐 아니라 파일, 콘솔 등 다양한 입력 가능- nextLine(), nextInt(), nextTokenizer() 등 다양한 타입을 입력받을 수 있다.- 멀티스레드 환경에서는 부적합- 정규표현식 지  // 임포트 필요 import java.io.BufferedReader;      import java.io.InputStreamReader; import java...
2024.05.27
no image
자바: getter, setter 메서드
Getter와 Setter란?객체지향 프로그래밍에서 클래스의 속성(필드)을 외부에서 접근할 수 있도록 하는 메서드데이터 보존을 위해 private으로 객체를 보호하므로, 이 객체의 값에 접근하기 위해서는 같은 클래스 안의 메서드를 만들어두고 해당 메서드를 통해 접근해야 함.Getter : 클래스의 필드 값을 반환하는 메서드Setter : 클래스의 필드 값을 설정하는 메서드 작성법Getter 메서드 :- 반환타입은 필드의 타입과 동일- get + 필드이름(첫 글자 대문자)Setter 메서드 :- 반환타입은 void- set + 필드이름(첫 글자 대문자)public class Person {     // private으로 객체보호     private String name;       private int ..
2024.05.23

JAVA: 알고리즘, APS, 시간복잡도

친환경 개발자
|2024. 8. 4. 13:30

알고리즘이란?

어떠한 문제를 해결하기 위해 수행해야 하는 절차나 방법을 말한다.

 

 

APS(Algorithm Problem Solving)

말 그대로 알고리즘 문제를 해결하는 것. 

문제 해결능력을 기를 수 있다!

 

 

 

 

좋은 알고리즘 기준

  1. 정확도 : 정확한 결과가 출력되는가? 얼마나 정확하게 동작하나? 
  2. 실행속도(작업량): 적은 연산으로 문제를 해결할 수록 실행속도가 빠르다.
  3. 메모리 사용량: 적은 메모리를 사용할수록 컴퓨팅 자원을 아낄 수 있다.
  4. 가독성: 다른 사람이 이해하기 쉽도록 단순해야 한다.
  5. 최적성: 더 이상 개선의 여지가 없는가?

 

 

 

 

 

알고리즘을 나타내는 방식 2가지

 

  • 의사코드(pseudo code)

특정 언어에 관계 없이 쉽게 이해할 수 있도록 나타내는 코드.

정해진 규칙이 없이 이해만 잘 되면 됨.

 

 

 

  • 순서도

그림으로 표현한 방식으로, 조건문(분기문)은 마름모꼴로 표현한다.

 

 

시간복잡도(Time Complexity)

알고리즘의 작업량 및 효율성을 계산할 때, Big-O 표기법을 가장 많이 사용.

실제 걸리는 시간을 측정하거나 연산의 수를 계산하는 것은 현실적으로 어렵기 때문에

가장 큰 영향력을 주는 n에 대한 항만을 표시하여 사용!!

  • 계수는 생략한다
  • 최악의 경우를 가정하여 계산하는 방식

 

 

알고리즘 문제풀이 5단계

  1. 문제를 꼼꼼하게 읽고 데이터 범위, 조건을 확인한다
  2. 조건과 데이터의 범위에 맞는 자료형 선정, 알고리즘을 선택한다.
  3. 문제풀이 방식을 구상한다
  4. 구상한 방식을 코드로 작성한다
  5. 알맞게 답이 출력되는지 확인하고 수정한다.

JAVA : UML 클래스 다이어그램

친환경 개발자
|2024. 7. 21. 23:32

UML

: Unified Modeling Language. 모델을 만들기 위한 표준 언어

  • 다른 사람들과 의사소통할 떄 사용
  • 시스템의 구조, 클래스 의존성 등 파악
  • 건축도면과 같은 느낌
  • 크게 2가지 유형(구조 다이어그램, 행위 다이어그램)이고, 유형 별 7개 씩 총 14개의 세부 다이어그램 존재함.
  • 클래스 다이어그램은 구조 다이어그램에 속한다!

 

 

 

클래스 다이어그램

  • 프로그램의 구조를 그림으로 표현한 것.
  • 기본 구성요소는 클래스, 속성, 메서드, 관계
  • 인터페이스는 <<interface>> 추가
  • 추상클래스는 <<abstract>>추가 or 이탤릭체로 표기

 

 

 

 

 

 

 

 

 

접근제어자 표시 범위
private - 본인 클래스만 접근 가능
public + 어떤 클래스에서든 접근 가능
protected # 동일 패키지 or 상속받은 클래스만 접근 가능
(default) ~ 동일 패키지만 접근 가능

 

 

 

 

 

JAVA : 상속

친환경 개발자
|2024. 7. 21. 14:00

상속이란

  • 상위 클래스의 속성(=멤버변수)과 메서드(멤버메서드)를 물려 받아 자식 클래스를 정의하는 것
  • 상위 클래스가 쓰던 것을 그대로 쓰는데, 거기에 더 확장하고 차별화를 두고 싶을 때 사용
  • 상위, 부모, super클래스 <---- 하위, 자식, sub 클래스
    자동차 / 개 / 사람 <---- 세단, 트럭,... / 말티즈, 요크셔테리어,... / 요리사, 학생,...

 

 

 

 

 

상속의 특징

  • 확장성, 재사용성: 자동차 리스트를 관리하는데, 별개로 세단과 전기차, 버스 등을 별도로 관리하고 싶다면?
                                  자동차의 속성을 그대로 가져가면서도 버스, 수용인원 등의 별도 속성을 관리할 수 있도록
                                  상속을 활용하여 하위 클래스를 생성할 수 있다.
  • 자식 클래스는 부모 클래스의 멤버 변수와 메서드들을 마치 본인이 선언한 것처럼 사용이 가능
  • extends 키워드를 사용해 상속받을 수 있다 :
              [접근제어자] (static) 클래스명 extends 부모클래스명 {

              }
  • 생성자 호출 시 super() 키워드 사용! (생략해도 구동 시 알아서 부모 클래스에서 찾아온다.)
  • super키워드는 반드시 자식클래스 생성자 내 첫 번째 줄에 위치해야만 한다!
class Car {    // 부모 클래스
    String brand;
    int year;

    // 기본 생성자
    Car() {
        this.brand = "Unknown";
        this.year = 0;
        System.out.println("Car의 기본 생성자가 호출되었습니다.");
    }

    // 파라미터를 입력받는 생성자
    Car(String brand, int year) {
        this.brand = brand;
        this.year = year;
        System.out.println("Car의 파라미터 생성자가 호출되었습니다.");
    }
}

 

class Sedan extends Car {    //자식 클래스
    int seats;

    // 기본 생성자
    Sedan() {
        // super()는 부모 클래스의 기본 생성자를 호출합니다.
       super();
        this.seats = 5;
        System.out.println("Sedan의 기본 생성자가 호출되었습니다.");
    }

    // 파라미터를 입력받는 생성자
    Sedan(String brand, int year, int seats) {
        // super(brand, year)는 부모 클래스의 파라미터를 입력받는 생성자를 호출합니다.
        super(brand, year);
        this.seats = seats;
        System.out.println("Sedan의 파라미터 생성자가 호출되었습니다.");
    }
}

 

 

Object 클래스??

  • 모든 클래스는 Object라는 클래스를 기본적으로 상속받고 있다. extends Object를 쓰지 않아도 알아서 상속한다.
  • equals(), hashCode(), toString() 등의 메서드를 선언하지 않고 사용하는 것은 Object클래스에 이미 마련되었기 때문!

 

 

 

오버라이딩

  • 상위 클래스에서 선언된 메서드를 상속받은 자식 클래스에서 재정의하는 것 ( = 덮어쓰기)
  • 서드의 이름, 반환형, 매개변수가 모두 동일해야 한다! = 단지 메서드 내부 로직이 바뀌는 것!
  • 반드시 상속 관계에서만 사용 가능
  • 어노테이션 표시를 해야 한다. (권장)
  • 조상보다 더 큰 예외를 던질 수 없다.

 

class Car {
    void startEngine() {
        System.out.println("엔진이 켜졌습니다.");
    }
}

class ElectricCar extends Car {
    // 오버라이딩: ElectricCar만의 방식으로 startEngine 메서드를 다시 정의합니다.
    @Override    // 어노테이션
    void startEngine() {
        System.out.println("전기 엔진이 조용히 켜졌습니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        ElectricCar myElectricCar = new ElectricCar();
        myElectricCar.startEngine();  // "전기 엔진이 조용히 켜졌습니다." 출력
    }
}

JVM

  • Java Virtual Mahine - 자바 가상 머신
  • OS에 상관 없이 실행할 수 있도록 만들어주는 역할
  • 메서드영역 (method Area) : 클래스, 인터페이스 관련한 정보를 저장하는 영역
  • 힙 영역 (heap Area) : 설계도를 통해 만들어진 객체와 그 문자열, 배열 등이 저장되는 영역
  • 스택 영역 (stack Area) : 메서드를 호출할 때마다 프레임이 생성되고, 지역변수 등도 함께 임시 저장됨. 해당 메서드가 종료되면 하나씩 사라지는 방식. LIFO 방식(Last In First Out)

 

 

 

 

 

 

 

static

구분 static non-static
 구동 시점 클래스가 메서드 영역에 로딩될 때 생성 일반 멤버변수이므로, new 키워드 쓸 때(객체 생성할 떄) 만들어짐
메모리 할당 오직 1개의 메모리 공간 할당 인스턴스마다 별도로 할당
목적 모든 인스턴스에 공용으로 사용할 변수 or 메서드를 정의할 떄 주로 사용 개별적으로 관리할 때 사용
접근 방법 클래스 이름으로 접근
Dog.age = 2;
객체를 생성해야 접근 가능
Dog dog = new Dog();
dog.age = 2;

 

 

 

 

★ static영역에서는 non-static 영역에 직접 접근이 불가하고

 

     non-static 영역에서는 static 영역에 접근이 가능하다!

 

staitc 영역인 main 메서드에서 선언된 name은 

 

non-static 영역인 '스태틱'클래스에서 접근이 가능.

 

그러나 반대로 age는 메인 메서드 영역에서 접근이 불가능하다!

 

 

 

 

 

접근제어자

  • private : 자기 클래스에서만 접근 가능
  • protected : 같은 패키지(폴더) 에서 접근 가능, 다른 패키지에서는 접근 안됨.
                      But 다른 패키지 클래스를 상속받았다면? 상속받은 본인 클래스로 선언하면 가능
  • (default) : 제어자 입력이 없다면 default로 적용됨. 같은 패키지 에서만 접근 가능
  • public : 모든 위치에서 접근 가능

  동일 클래스(자기 자신) 동일 패키지 다른 패키지의 하위 클래스 다른 패키지
private 접근가능 접근 불가능 접근 불가능 접근 불가능
default 접근가능 접근가능 접근 불가능 접근 불가능
protected 접근가능 접근가능 접근가능 접근 불가능
public 접근가능 접근가능 접근가능 접근가능

객체


(국어사전) 의사나 행위가 미치는 대상, 문장 내에서 동사의 행위가 미치는 대상

프로그래밍에서는? 데이터와 관련한 알고리즘을 하나의 단위로 묶은 것

 

 

 

 

객체지향 프로그래밍


객체 단위로 묶어 코드를 작성함으로써, 객체 간 상호작용을 활용하는 프로그래밍 방법

  • 추상화: 객체의 세부사항을 숨기고 필요한 기능만을 제공함
  • 다형성: 상속 관계에서 각 객체가 서로 다른 방식으로 작동하도록 함
  • 상속: 기존 클래스를 새로운 클래스가 상속받음으로써 재사용 및 확장이 가능
  • 캡슐화: 데이터와 메서드를 하나로 캡슐화함으로써 객체 데이터 등을 숨겨 보안에 강화

  >>> 코드의 유지보수, 재사용성, 유연성이 커진다는 장점

 

 

클래스


  • 객체를 만들기 위한 설계도
  • 설계도를 만들어두면, 그 설계도대로 객체들을 만들어낼 수 있다.
  • 인스턴스: 클래스를 통해 만들어진 해당 객체 >> 실제 메모리에 생성
  • 멤버변수: 속성(데이터)
  • 멤버메서드: 동작(메서드)
  • 생성자: 객체를 생성할 때 호출하는 특별한 메서드
  • 기본생성자: 클래스 작성 시 별도로 사용자가 작성하지 않으면 자동으로 JVM에서 생성함.
                        별도 작성 있으면 기본생성자 호출 불가!

 

 

 

생성자


  • new키워드와 함께 호출
  • 클래스명과 동일해야한다
  • 반환타입 없다(void조차 없음)
  • 객체 생성 시 반드시 생성자가 호출된다(new로 생성 시)
  • 객체의 멤버 필드를 선언과 동시에 초기화할 때 주로 사용한다
  • 웬만하면 기본 생성자를 직접 만들어주는 것이 좋다!
  • this : 생성된 인스턴스가 가지고 있는, 참조하는 값

 

public class Movie {

//멤버변수
int id;
String title;
String director;
String genre;
int runningTime;

//기본생성자
Movie() {
System.out.println("기본생성자 호출");
}

//매개변수 받는 생성자
Movie(int id, String title, String director, String genre, int runningTime) {
this.id = id;
this.title = title;
this.director = director;
this.genre = genre;
this.runningTime = runningTime;
}

//메서드
void movieInfo() {
System.out.printf("등록번호: %d\n제목: %s\n제작자: %s\n장르: %s\n상영시간: %d", id, title, director, genre, runningTime);
}
    
}

 

 

public class MovieTest {

public static void main(String[] args) {

//객체 생성
Movie movie1 = new Movie(1, "인터스텔라", "놀란", "스릴러", 300);
Movie movie2 = new Movie(2, "마더", "봉준호", "공포", 100);
Movie movie3 = new Movie(3, "아바타", "카메룬", "판타지", 92);

movie1.movieInfo();
System.out.println("\n");
movie2.movieInfo();
System.out.println("\n");
movie3.movieInfo();
System.out.println("\n");
 
}

}

자바: Map 클래스, 자주 쓰는 메서드

친환경 개발자
|2024. 6. 4. 21:25



Map(맵) 인터페이스

  • 키-값 쌍을 저장
  • 데이터 검색에 효율적이기에 자주 사용
  • 키 중복 불가능, 키와 값은 1대1로만 매치

 

 

 

 

 

Map(맵) 클래스

 

데이터 읽기 성능 : HashMap > LinkedHashMap > TreeMap > HashTable

종류 HashMap TreeMap LinkedHashMap HashTable
동기화 여부 비동기화 비동기화 비동기화 동기화
정렬 순서 없음 key값에 따라 정렬 없음 없음
삽입 순서 유지 없음 없음 삽입 순서 유지 없음
null 허용 키-값 둘 다 허용 값만 허용 키-값 둘 다 허용 허용 X
성능 평균 O(1) 평균 O(log n) 평균 O(1) 평균 O(1)

 

 

 

 

 

 

자바에서 큐의 주요 메서드

  • put(K key, V value): 지정된 키와 값을 맵에 추가
  • get(Object key): 지정된 키와 연결된 값을 반환
  • containsKey(Object key): 맵에 지정된 키가 포함되어 있는지 확인
  • containsValue(Object value): 맵에 지정된 값이 포함되어 있는지 확인
  • remove(Object key): 지정된 키로 맵에서 요소를 제거
  • size(): 맵에 있는 키-값 쌍의 수를 반환
  • keySet(): 맵의 모든 키를 포함하는 Set을 반환
  • values(): 맵의 모든 값을 포함하는 Collection을 반환
  • entrySet(): 맵의 모든 키-값 쌍을 포함하는 Set을 반환
  • isEmpty(): 맵이 비어 있는지 확인
  • clear(): 맵의 모든 요소를 제거

 

 

 

 

 

예시

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        
        // put: 요소 추가
        map.put("Apple", 1);
        map.put("Banana", 2);
        map.put("Cherry", 3);
        
        // get: 키로 값 가져오기
        System.out.println("Apple: " + map.get("Apple"));
        
        // containsKey: 키가 존재하는지 확인
        System.out.println("Contains 'Banana': " + map.containsKey("Banana"));
        
        // containsValue: 값이 존재하는지 확인
        System.out.println("Contains value 3: " + map.containsValue(3));
        
        // remove: 키로 요소 제거
        map.remove("Cherry");
        
        // size: Map의 크기
        System.out.println("Map size: " + map.size());
        
        // keySet: 모든 키를 Set으로 반환
        System.out.println("Keys: " + map.keySet());
        
        // values: 모든 값을 Collection으로 반환
        System.out.println("Values: " + map.values());
        
        // entrySet: 모든 키-값 쌍을 Set으로 반환
        System.out.println("Entries: " + map.entrySet());
        
        // isEmpty: Map이 비어 있는지 확인
        System.out.println("Is map empty: " + map.isEmpty());
        
        // clear: 모든 요소 제거
        map.clear();
        System.out.println("Is map empty after clear: " + map.isEmpty());
    }
}

자바: Queue(큐)

친환경 개발자
|2024. 6. 2. 21:56



Queue(큐)

  • 데이터의 순서를 유지, 가장 먼저 들어온 데이터가 가장 먼저 나가는 자료 구조(선입선출 = FirstInFirstOut)
  • 줄 서기, 인쇄 작업 처리, 프로세스 관리 등에서 사용

 

 

자바에서 큐의 주요 메서드

  • add(요소값): 큐의 끝에 요소를 추가 (큐가 다 차면 예외 발생)
  • offer(요소값): 큐의 끝에 요소를 추가 (큐가 다 차면 false 반환)

  • remove(): 큐의 앞에서 요소를 제거하고 반환 (비어있으면 예외 발생)

  • poll(): 큐의 앞에서 요소를 제거하고 반환 (비어있으면 null 반환)

  • element(): 큐의 앞에 있는 요소를 반환 (비어있으면 예외 발생)

  • peek(): 큐의 앞에 있는 요소를 반환 (비어있으면 null 반환)

  • isEmpty(): 큐가 비어있는지 확인 (true / false)

  • size(): 큐의 요소 개수 반환

 

 

예시

import java.util.LinkedList;
import java.util.Queue;

public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();

        // 요소 추가 (enqueue)
        queue.add(1);  // 또는 queue.offer(1);
        queue.add(2);
        queue.add(3);

        // 요소 확인 (peek)
        System.out.println("Front element: " + queue.peek());  // 또는 queue.element();

        // 요소 제거 (dequeue)
        System.out.println("Removed element: " + queue.poll());  // 또는 queue.remove();

        // 큐가 비어있는지 확인
        System.out.println("Is queue empty? " + queue.isEmpty());

        // 큐의 크기 확인
        System.out.println("Queue size: " + queue.size());
    }
}



StringTokenizer??

  • 문자열을 원하는 구분자로 나누어 토큰으로 분리할 때 사용
  • java.util 패키지에 속해 있음
  • 기본은 공백 기준으로 쪼개준다

 

 

사용법

1. 기본 구분 (공백으로 구분)

 

String str = "Java is fun";
StringTokenizer st = new StringTokenizer(str);

while (st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}
    // 출력: Java   is   fun

 

 

 

 

2. 원하는 구분자로 구분

두 번째 매개변수로 원하는 구분자를 입력하면 해당 구분자를 기준으로 쪼개준다.

String str = "Java, is, fun";
StringTokenizer st = new StringTokenizer(str, ", ");

while (st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}
   //출력: Java   is   fun

   

 

 

3. 구분자까지 토큰으로 포함

 

세 번째 매개변수를 true로 설정할 경우 구분자까지 하나의 토큰으로 간주한다!

String str = "Java,is,fun";
StringTokenizer st = new StringTokenizer(str, ",", true);

while (st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}
    // 출력: Java   ,   is   , fun

  

 

 

 

 

StringTokenizer의 주요 메서드

1. hasMoreTokens(): 다음 토큰이 있는지 확인

 

2. nextToken(): 다음 토큰을 반환

 

3. countTokens(): 남은 토큰의 수 반환

 

 

 

 

 

 

split과의 차이?

 

StringTokenizer는 클래스이고, split은 String클래스에 있는 메서드이다!

 

StringTokenizer는 구분자로 문자열 or 문자 사용, split은 정규표현식 지원한다.

 

따라서 StringTokenizer는 간단한 작업, 가볍게 사용할 때 사용하며,

 

split은 정규표현식을 처리하는 만큼 복잡하고 유연한 사용이 필요할 경우에 사용하기 좋다.

자바: BufferedReader , Scanner

친환경 개발자
|2024. 5. 27. 22:26


입력을 처리하는 방법 중 가장 많이 사용되는 클래스가

BufferedReader, Scanner이다.

 

BufferedReader, Scanner 특징

BufferedReader

- 입력을 버퍼링 하여 빠르게 읽음

- readLine()을 사용해 한 줄씩 읽을 수 있음

- 멀티스레드 환경에서 안전하게 사용 가능

 

Scanner

- 사용 비교적 간편

- 문자열 뿐 아니라 파일, 콘솔 등 다양한 입력 가능

- nextLine(), nextInt(), nextTokenizer() 등 다양한 타입을 입력받을 수 있다.

- 멀티스레드 환경에서는 부적합

- 정규표현식 지

 

 

<BufferedReader 예시>

// 임포트 필요

import java.io.BufferedReader;      

import java.io.InputStreamReader;
import java.io.IOException;

public class BufferedReaderExample {
    public static void main(String[] args) {
        // 입력 받기 위한 변수 선언
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try {
            System.out.print("Enter your name: ");
            String name = reader.readLine();  // 한 줄씩 입력
            System.out.println("Hello, " + name + "!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

<Scanner 예시>
// 임포트 필요

import java.util.Scanner;


public class ScannerExample {
    public static void main(String[] args) {
        // 입력 받기 위한 변수 선언

        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter your name: ");
        String name = scanner.nextLine(); 
        System.out.println("Hello, " + name + "!");
    }
}

 

비교

 

특징 BufferedReader Scanner
입력속도 더 빠름 비교적 느림
사용 용이성 복잡 (예외처리, 입력타입 문자열 뿐) 간편 (다양한 메서드 제공)
데이터 타입 String 다양 (int, double,String 등)
정규 표현식 지원 X 지원
멀티스레드 환경 멀티스레드에서 안전 멀티스레드에서 위험

 

 

 

 

 

 

 

속도차이가 나는 이유는 Buffer 사용 여부 차이, 정규표현식 적용 과정 여부 등 때문

 

여기서 Buffer란 데이터를 일시적으로 저장하는 메모리 공간을 말함.

 

BufferedReader는 8KB 크기의 버퍼에 저장되었다가 한 번에 전송하는 방식이고

 

Scanner는 입력에 바로바로 전송되는 방식

 

바로바로 전송되는 것보다 여러개 묶어서 보내는 것이 더 효율적이라는 원리.

 

 

 

 

 

결론

 

BufferedReader는 데이터 입력이 많거나 멀티스레드 환경, 빠르고 효율적인 처리가 필요할 때 사용

Scanner 다양한 데이터 타입을 입력할 수 있어 간편하므로 간단한 입력 처리인 경우에 용이

 

웬만하면 BufferedReader 사용하는 것으로 하자..

 

 

자바: getter, setter 메서드

친환경 개발자
|2024. 5. 23. 21:18

 

 

Getter와 Setter란?

  • 객체지향 프로그래밍에서 클래스의 속성(필드)을 외부에서 접근할 수 있도록 하는 메서드
  • 데이터 보존을 위해 private으로 객체를 보호하므로, 이 객체의 값에 접근하기 위해서는 같은 클래스 안의 메서드를 만들어두고 해당 메서드를 통해 접근해야 함.
  • Getter : 클래스의 필드 값을 반환하는 메서드
  • Setter : 클래스의 필드 값을 설정하는 메서드

 

작성법

  • Getter 메서드 :
    - 반환타입은 필드의 타입과 동일
    - get + 필드이름(첫 글자 대문자)

  • Setter 메서드 :
    - 반환타입은 void
    - set + 필드이름(첫 글자 대문자)

public class Person {
    // private으로 객체보호

    private String name;   
    private int age;

    // 이름 반환
    public String getName() {
        return name;
    }

    // 이름 설정
    public void setName(String name) {
        this.name = name;
    }

    // 나이 반환
    public int getAge() {
        return age;
    }

    // 나이 설정
    public void setAge(int age) {
        this.age = age;
    }
}

 

 

사용하는 이유?

  • 캡슐화: 클래스 내부 구현을 숨기고(정보 은닉), 외부에서의 접근을 제한하여 객체 보호
                 >> 마치 TV를 볼 때 TV가 어떻게 작동하는지 원리를 우리가 모르고 쓰는 것과 같음
  • 유효성 검사 : Setter를 통해 값 설정 시 유효성 검사 수행 가능
  • 디버깅, 유지보수 : 코드의 가독성을 높이고 메서드 수정을 통해 유지보수 용이하게 함

 

장점

  • 데이터 접근 제어: 객체의 속성에 대한 읽기 및 쓰기 권한 제어
  • 캡슐화

단점

  • 실질적인 정보 노출: 변수를 private를 선언하더라도 getter, setter를 통해 접근하면 데이터 접근이 가능
  • 외부 접근 시 캡슐화가 지켜지지 않아 코드 안정성이 무너질 수 있음

 

Getter, Setter 메서드 사용 시 데이터에 접근 권한을 주는 것과 마찬가지.

데이터의 무결성을 약화시킨다.

따라서 사용을 지양하는 것이 좋다.

 

 

인텔리제이 꿀팁

인텔리제이에서 편리하게 getter, setter 메서드를 작성하는 팁이 있다.

마우스 우클릭 - Generate 클릭

 

Getter and Setter 클릭

 

 

 

OK
생성 완료