'Java' 카테고리의 글 목록 (2 Page)
본문 바로가기
728x90

Java52

[Java] 추상 클래스(abstract class), 추상 메서드(abstract method) 이 글은 https://youtu.be/CXuA31XcBZ0 를 통해 개념 정리 후 복습용으로 정리한 글입니다. 문제시 바로 삭제하겠습니다. 추상 클래스(abstract class) 미완성 설계도. 미완성 메서드를 갖고 있는 클래스 abstract class Player { // 추상 클래스(미완성 클래스) abstract void play(int pos); // 추상메서드(몸통{}이 없는 미완성 메서드) abstract void stop(); // 추상메서드 } abstract - 추상 클래스라고 표현, 상속해서 구현하라는 의미 다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가 Player p = new Player(); // 에러. 추상 클래스는 인스턴스 생성 불가 상속을 통해 추상 메서.. 2022. 12. 24.
[Java] super, package, import, modifier, polymorphism 이 글은 https://youtu.be/CXuA31XcBZ0 를 통해 개념 정리 후 복습용으로 정리한 글입니다. 문제시 바로 삭제하겠습니다. super 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자) 내에만 존재 -> static 메서드 내에 사용 불가 조상의 멤버와 자신의 멤버를 구별할 때 사용 Class ex{ public static void main(String args[]) { Child c = new Child(); c.method(30); } } class Parent { int x = 10; } // super.x class Child extend Parent { int x = 20; // this.x void method(int x) { System.out.println("x =.. 2022. 12. 23.
[Java] Optional<T> T 타입 객체의 래퍼클래스 - Optional public final class Optional { private final T value; // T타입이 참조변수 // T value는 모든 객체 저장 가능 NULL 포함 } 여기서 NULL 포함한 모든 객체 저장 가능한게 중요한 포인트다. NULL을 직접 다룬다면 NullPonterException 발생할 위험이 크고, 조건문을통해서 NULL을 확인해야 하기 때문에 Optinal 객체를 사용한다. Optinal는 객체기 때문에 주소를 가지고 있고, 그 주소가 가지고 있는 값이 NULL이기 때문에 NullPonterException 발생할 가능성이 없어진다. NULL을 직접 다루지 않기 위해 String, arr 에서는 아래와 같이 사용된다. String.. 2022. 12. 8.
[Java] 선언 위치에 따른 변수의 종류 선언 위치에 따른 변수의 종류 public class Class { ​ int iv; // 인스턴스 변수 (Instance Valiable) static int cv; // 클래스 변수(Class Valiable) void method() { int lv; // 지역 변수(Local Valiable) } } 인스턴스 변수 클래스 내에 선언된 변수 인스턴스 변수는 인스턴스가 생성될 때 생성된다. 객체 생성 시마다 새로운 변수가 생성된다. 인스턴스 별로 다른 값을 가질 수 있다. 즉, 각각의 인스턴스 변수마다 고유의 값을 가진다. 클래스 변수 인스턴스 변수에 Static 키워드만 붙여주면 된다. 인스턴수 변수와 다르게 공통된 값을 공유하게 된다. 클래스가 메모리에 올라갈 때 부터 프로그램이 종료될 때까지 유.. 2022. 12. 5.
[Java] Stream, 스트림 생성 스트림이란? 스트림은 자바 8에서 추가된 기능으로 함수형 인터페이스인 람다를 활용할 수 있는 기술로 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것이다. 즉, 컬렉션과 배열을 스트림으로 만들면 이후 작업은 통일된다. 스트림의 특징 스트림은 중간연산, 최종연산이 있는데 중간 연산은 0~n번 작업 가능, 최종 연산은 마지막에 0~1번 가능 스트림은 데이터 소스로부터 데이터를 읽기만할 뿐 변경하지 않는다. 스트림은 Iterator처럼 일회용이다. 필요하면 다시 생성해야 한다. 최종 연산 전까지 중간연산이 수행되지 않는다. - 지연된 연산 IntStream intStream = new Random().ints(1,46); // 1~45범위의 무한 스트림 intStream.distinct().limit(6.. 2022. 11. 30.
[Java] 람다식 ( Lambda Expression ) 함수와 메서드 차이 함수는 클래스에 독립적, 메서드는 클래스에 종속적 java : oop 언어 + 함수형(fp) 언어 람다식이란 ( Lambda Expression) 함수를 간단한 식으로 표현하는 방법 // function int max (int a, int b) { return a > b ? a: b; } // lambda (a, b) -> a > b ? a : b 람다식 작성하기 메서드 이름과 반환 타입을 제거하고 -> 를 불록 {} 앞에 추가한다. // 익명 함수로 사용 사실은 익명 객체! int max (int a, int b) -> { return a > b ? a: b; } 반환값이 있는 경우, 식이나 값만 적고 return문 생략 가능! + 끝에 ; 안 붙인다. 블록{} 안의 문장이 하나뿐 .. 2022. 11. 29.
[Java] 예외 처리 프로그램 오류 컴파일 에러(compile-time error) : 컴파일 할 때 발생하는 에러 주로 IDE가 기본적인 오류를 잡아줌 런타임 에러(runtime error) : 실행 할 때 발생하는 에러 에러 (error) : 심각한 오류 ex) out of memmory error 예외 (exception) : 다소 미약한 오류 Exception ... RuntimeException ... 논리적 에러(logical error) : 작성 의도와 다르게 동작 예외처리 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것으로 프로그램의 비정상 종료를 막고 정상적인 실행 상태를 유지하는 위한 것이다. 예외 클래스의 구조 Reference : https://www.benchresources.. 2022. 11. 24.
[Java] @ParameterizedTest 이름 설정, 인텔리제이 오류 @DisplayName("로또 정상 값 테스트") @ParameterizedTest(name = "[{index}] input {0} ") @ValueSource(strings = {"1,2,3,4,5,6", "1,10,20,30,40,45", "40,41,42,43,44,45"}) void lottoNumberTest(String inputString) { Lotto lotto = new Lotto(inputHandler.stringToList(inputString)); assertThat(lotto.getLottoNumbers()).isEqualTo(inputHandler.stringToList(inputString)); } you can customize invocation display names.. 2022. 11. 24.
[Jvav] Map.getOrDefault Map.getOrDefault(Object Key, Integer defaultValue) V getOrDefault(Object Key, Object defaultValue) 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없거나 null이면 기본 값을 반환한다. public static void main(String arg[]) { ​ String [] abc = { "A", "B", "C" ,"C"}; Map map = new HashMap(); ​ for(String key : abc) { map.put(key, map.getOrDefault(key, 0) + 1); } System.out.println("결과 : " + map); // 결과 : {A=1, B=1, C=2} } 2022. 11. 24.
[Java] 일급 컬렉션(First Class Collection)이란? 일급 컬렉션을 간단하게 설명하면 Collection을 Wrapping하면서 그 외의 다른 멤버 변수가 없는 상태를 일급 컬렉션이라고 한다. 원시값 포장과 유사하다. 원시값을 포장하던것을 Collection을 포장하면 된다. public class Users { private List values; public Users(List values) { this.values = values; } } 위 코드가 일급 컬렉션이다. 일급 컬렉션을 사용함으로써 다음과 같은 이점을 가지게 됩니다. 비지니스에 종속적인 자료구조 ( ) Collection의 불변성을 보장 상태와 행위를 한 곳에서 관리 이름이 있는 컬렉션 1. 비지니스에 종속적인 자료구조 원시값 포장에서도 나온 개념으로 객체 자체로 검증로직을 처리할 수 있게.. 2022. 11. 22.
[Java]Wrapper Class Wrapper Class Wrapper Class는 기본타입을 객체로 포장하는 역할을 한다. Java의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어진다. 기본타입은 정수, 실수, 논리 타입이 있고, 참조 타입은 클래스, 인터페이스, 배열, 열거 타입이 있다. 실제로 Wrapper Class가 존재하는 것이 아닌, 기본타입의 데이터를 객체로 만들어주는 기능을 하는 클래스를 총칭해서 Wrapper Class라고 부른다. 자바는 모든 기본타입의 값을 갖는 객체를 생성할 수 있다. 이런 객체를 포장 ( Wrapper ) 객체라고 하는데, 기본타입의 값을 내부에 두고 포장하기 때문에 포장 객체이다. 기본타입 값은 외부에서 변경할 수 없다. 기본타입(pr.. 2022. 11. 11.
[Java] 원시값 포장 Wrapper Class랑 비슷한 개념이다. 하지만 더 큰 범위를 포함한다. 원시값 포장 원시값 포장은 원시유형의 값을 이용해 의미를 나타내지 않고, 의미 있는 객체로 포장한다는 개념이라고 볼 수 있다. 변수를 선언하는 방법에는 두 가지가 있다. int Coin = 20; Coin coin = new coin(20); 포장하는 이유 게임에 사용되는 coin이 있다고 가정하자. coin은 가지고 있을 수 있는 범위가 정해진다거나, 게임을 할때마다 확인한다면. 그때마다 코인의 값이 조건을 만족하는지 확인하려면, 많은 중복된 코드가 작성될 것이다. Coin Class 로 원시값 coin 을 포장하면 문제를 해결할수있게된다. public class Coin { public static final String C.. 2022. 11. 8.
[Java] List, ArrayList 차이 찾아본 결과 간단하게 List = interface ArrayList = class 이렇게 표현할 수 있다. 그럼 차이점은 무엇인가. ArrayList list = new ArrayList (); (O) List list = new ArrayList (); (O) ArrayList list = new List (); (X) 이렇게 보면 대충 느낌이 올것같다. 자바의 두가지 이점을 가지고 있는데 한가지는 다형성이고, 한가지는 유연성이다. 다형성 ArrayList list = new ArrayList (); (O) 벤츠 list = new 벤츠(); List list = new ArrayList (); (O) 자동차 list = new 벤츠(); 위와같이 클래스를 생성 할 때 자동차 타입으로 생성하게 되면 .. 2022. 8. 30.
[Java] 문자열 합치기 왜 StringBuilder 인가 왜 StringBuilder 사용할까? java 에서 많은 문자열을 연결하면 많은 중간 문자열 객체가 생성되어 비효율적인 코드가 생성된다고 한다. 이유는 자바에서 String 객체는 변경 불가능하다. 한 번 생성되면 내용을 바꿀 수 없단 뜻이다. 따라서 하나의 문자열을 다른 문자열과 연결하면 새 문자열이 생성되고, 이전 문자열은 가비지 컬렉터로 들어간다. String str= "a" + "b" + "c" + "d" + "e"; str= "ab" + "c" + "d" + "e"; str= "abc" + "d" + "e"; str= "abcd" + "e"; str= "abcde"; 그래서 이러한 메모리 낭비를 위해 StringBuilder를 사용한다. StringBuilder는 변경 가능한 문자열을 만들어주.. 2022. 8. 16.
[Java]문자열 자르기 java에서 문자열 자르는 방법은 3가지가 있다. Substring split tokenizer String Class indexOf() String ex = "123-123"; int idx = ex.indexOf("-"); ​ //결과값 : 인덱스 값 출력 // 3 substring() : 문자열을 인덱스로 자른다. //사용법 String.substring(start) //문자열 start위치부터 끝까지 문자열 자르기 String.substring(start,end) // 문자열 start위치 부터 end전까지 문자열 가져오기 String ex = "123-123"; ex.substring(4); //123 ex.substring(2,4); //3-3 split() : 지정한 문자를 기준으로 문자열을.. 2022. 8. 9.
[Java] EOF 처리 알고리즘 문제를 풀다보면 런타임에러가 발생하는데 , 종료 조건 없이 입력이 주어진 상황에서 EOF(End of File)때문에 에러가 발생한다. 즉, 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없어서 생기는 문제다. 대표적인 Scanner, BifferedReader 두 가지로 이를 처리하는 방법을 알아보자. Scanner Class Scanner에서 더이상 읽을 데이터가 없으면 NoSuchElementException 을 던져준다. EOF 상황은 stop 'Main' 버튼을 누르거나, EOF를 입력해주거나, EOF 입력 같은 경우 윈도우의 경우는 "ctrl + z", 리눅스계열의 경우 "ctrl + d" 를 입력하거나 다른 타입을 입력해 InputMismatchException을 던져주거나 Sc.. 2022. 8. 5.
[Java] 입력 InputStream, Scanner, BufferedReader 비교 InputStream InputStream 의 정의는 This abstract class is the superclass of all classes representing an input stream of bytes. 이 추상 클래스는 바이트의 입력 스트림을 나타내는 모든 클래스의 슈퍼 클래스입니다. 여기서 중요한건 "바이트 입력 스트림"이다. byte 란? 하나의 단위로서 다루는 비트(bit)의 모임. 8비트의 모임을 1바이트라고 한다. Stream 이란? Stream in java A stream is a sequence of objects that supports various methods which can be pipelined to produce the desired result. 스트림(St.. 2022. 7. 26.
[Java] java의 인코딩 Unicode, UTF-8, EUC-KR Unicode 이전 글에서 본 문제점을 해결하기 위해 국제 표준화 기구(IOS)는 표준화작업을 진행하였다. 유니코드는 유니코드 컨소시엄에서 표준을 제정하고, 문자 집합, 문자열 인코딩, 문자열 처리 방식, 문자 정보 데이터베이스 등을 제공한다. 유니코드의 경우 각 나라별로 자신의 언어가 속하고 있는 고유한 공간을 할당받는다. 한글의 경우에는 0xAC00부터 시작하여 11172 자의 공간을 차지한다. 모든 글자는 사전 순서대로 매핑되어있다. 즉, 유니코드는 숫자와 글자 키와 값이 1:1로 매핑된 형태의 코드이다. 저장 효율을 위해 언어에 따라 하나의 문자를 표현하는데 1~4byte를 사용한다. 이로인해 유니코드는 26개국에서 같은 데이터를 공유할 수 있게 되어, 표준 인코딩 기법이 되었다. 이전에 사용하던.. 2022. 7. 22.
[Java] java의 인코딩 ASCII Code, Extend ASCII Code ASCII Code 아스키 코드는 1963년 미국 ANSI에서 표준화한 정보교환용 7비트 부호체계이다. 최상위 비트는 0으로 고정되어있고, 7bit를 사용하여 1Byte로 구성되어있다. 영어 알파벳과 특정 문자에 대해서 숫자와 1:1 매핑을 시켜놓은 것으로 한글을 포함한 다른 언어를 나타낼 수 없다. 그래서 유니코드가 등장했다. Extended ASCII Code ASCII 문자와 추가 문자를 포함하는 8 비트 부호체계이다. 2^8 = 256 개의 문자를 표현할 수 있다. ASCII control charachets : code 00~31 주변 기기들을 제어할 때 사용. ASCII Printable characters : code 32~127 인쇄 가능한 문자로 문자, 숫자, 구두점, 기타 기호 등을 나.. 2022. 7. 19.
[Java] 람다식 람다식 Java8 이후부터 람다식이 가능하게 되었다. 람다함수란 프로그래밍 언어에서 사용되는 개념으로 익명 함수를 칭하는 용어이다. 람다 대수는 수학에서 사용하는 함수를 보다 단순하게 표현하는 방법을 뜻한다. 람다의 근원은 수학과 기초 컴퓨터과학 분야에서의 람다 대수이다. 람다식 예제 Runnable runnable = new Runnable() { //익명 구현 객체 public void run() { ~~~ } }; Runnable runnable = 90 -> { ~~~ }; //람다식 람다식 제한 람다식을 사용하기 위해서는 아래 조건을 모두 만족해야 한다. 인터페이스이어야 한다. 인터페이스에는 하나의 추상 메서드만 선언되어야 한다. 오버라이드 해야 할 추상 메서드가 2개 이상인 경우 람다 표현식을.. 2022. 6. 3.
[Java] 메모리 구조 자바 메모리 구조는 크게 3가지로 나뉜다. Stack - 메서드 단위로 생성된다고 보면 쉽다. 메서드의 매개변수도 별도의 메모리 공간을 가진 변수이다. 메서드 내부의 로컬 변수의 수명주기는 Stack Frame 단위이다. Stack 메모리가 꽉차면 Stack Over Flow 이다. Stack Stack Frame Local Variables Array - 로컬 변수 저장 ( 컴파일시 길이 지정 ) Oprend Stack - 명령어의 중간 연상 결과를 일시적으로 저장하는 스택 Frema data - 메서드외 관련된 그 외 정보 저장 Heap 인스턴스나 문자열 상수를 Heap Memory 공간에 저장한다. 참조되지 않은 인스턴스나 문자열 상수는 Garbage Collector 에 의해 메모리 공간에서 해제.. 2022. 5. 31.
[Java] "== vs equals" java에서 문자열을 생성에 여러 방법으로 생성할 수 있다. 그중 크게 2가지로 나누면 문자열 상수, 객체를 이용하여 생성(인스턴스로 저장된 문자열)으로 나뉜다. 두 방법의 차이는 문자열 상수는 String constant pool 공간에 저장이되고, 다른 방법으로 만들어진 객체는 Heap 공간에 저장이 된다. 즉, 두 문자열의 메모리 주소값이 다르다는 의미를 가지고 있다. 메모리 주소값이 다르면 == 연산자를 사용해 문자열 비교연산을 할 수 없다. 왜냐면 java8 에서 == 연산자는 기본 자료형에 저장된 값은 상수이므로 값을 기준으로 비교하나, 참조 자료형에 저장된 값은 메모리 주소값이기 때문에 메모리 주소값을 비교한다. 그럼 다른 방식으로 생성된 문자열을 비교하는 방법은 String class의 e.. 2022. 5. 27.
[Java] 스코프(scope) : { } 스코프 범위내에서는 범위 외부에 선언된 변수에 접근 가능하나 스코프 범위 외부에서 범위 내부에 선언된 변수에는 접근 할 수 없다. public class Main { public static void main(String[] args) { int out = 1; while(...) { //스코프 시작 int inner = 0; int result = out + inner; // 변수 out은 스코프 범위 밖에 있는 변수라 접근 가능 } //스코프 끝 inner = 3; // 변수 inner은 스코프 범위 밖에 있는 변수라 접근 불가능 } } 2022. 5. 20.
[Java] 암시적 형변환 암시적 형변환의 규칙은 아래와 같다. *reference - https://opentutorials.org/course/1223/5330 float->double 로 가는 경우 4 byte -> 8 byte 인데 암시적 형 변환이 가능한지에 대해서 의문이 생길 수 있다. 역으로 형변환을 할 시 byte 패딩을 제거하며 변환되기 때문에 값이 변질될 수 있습니다. 자료형의 메모리 공간 크기를 기준으로 변환하는 것이 아닌, 값의 표현 범위를 기준으로 변환하기 때문에 가능하다. byte a = 15; short b = a; //암시적 형 변환 명시적 형변환 구문 [자료형] [변수명] = (자료형)[변수명 또는 리터럴]; int a = (int) 300000000000L; ​ long b = 12345; int .. 2022. 5. 17.
[Java] 상수, 리터럴 상수(Constant) = 변하지 않는 변수 리터럴(Literal) = 데이터 그 자체 int a = 123; a는 변수, 리터럴은 123 final int a = 123; int 앞에 final를 붙일 시 a는 상수 java 에서 변수 long 자료형으로 변숫값을 대입할 때 리터럴 값에 접미사 L 을 명시해야 8 byte 할당 한다 변수 float 자료형으로 변숫값을 대입할 때 리터럴 값에 접미사 F 을 명시해야 4 byte 한다. java에서 리터럴은 약21억이 넘어가는 상수가 아닌 이상 그 이하의 수는 기본적으로 4 byte 크기로 스택 메모리 공간(operand stack)에 적재된다. 그럼 java 자료형 중 byte(1 byte), short(2 byte) 같은 경우 4 byte를 가지고 있는.. 2022. 5. 10.
728x90