티스토리 뷰

Java/기초

Java 기초

_Bibidi 2022. 7. 20. 15:55

 

 

자바 특징

 - 플랫폼 독립적 : 운영체제에 따라 코드를 재작성하지 않아도 됨.

 - 객체 지향적 : 절차 지향적 언어에 비해 생산성이 높음. 보안성 높음.

 

자바 프로그램 작성/실행 과정

 - 자바 소스 코드 작성 -> 자바 컴파일러가 바이트 코드 생성 -> 바이트 코드를 각 운영체제에 맞는 JVM이 실행

 

자바 활용도

 - 웹 애플리케이션, 모바일 애플리케이션, 엔터프라이즈 애플리케이션, 웹/앱 서버 등

 

자바 플랫폼

 - Java SE (Standard Edition) : 기본 개발 환경

 - Java EE (Enterprise Edition) : 서버 기반 프로그램 개발 환경

 - Java ME (Micro Edition) : 모바일, 임베디드 시스템 개발 환경

 

 

변수(Variable)

 - 데이터를 저장하는 메모리 공간에 붙여준 이름

 

변수 이름 규칙

 - 문자와 숫자, _(underscore), $ 사용 가능

 - 대문자와 소문자 구분

 - 숫자로 시작 불가

 - 공백 사용 불가

 - 미리 예약된 이름 사용 불가

 

표기법

 - 카멜 표기법(Camel case) : 가장 앞의 문자는 소문자로, 나머지 단어의 첫 문자는 대문자료 표기

 - 파스칼 표기법(Pascal case) : 각 단어의 첫 문자를 대문자로 표기

 

자료형(Data Type)

 - Number : int, long, float, double / 2진수(0b), 8진수(0), 16진수(0x)를 이용해 표현 가능

 - Boolean : true, false

 - Character : char

 - String : String, StringBuffer

 

문자열

 - String : 일반 문자열.

관련 메소드 : methods : equals, indexOf, replace, substring, toUpperCase

 - StringBuffer : 문자열을 자주 추가하거나 변경할 때 사용하는 자료형

관련 메소드 : append, insert, substring

 

자료구조

배열(Array)

 - 자료형에 [] 붙이면 해당 자료형에 대한 배열이 된다.

 

리스트(List)

 - 배열과 같이 여러 데이터를 담을 수 있는 자료형. 추가로 여러 가지 메소드를 제공  ex) ArrayList

관련 메소드 : add, get, size, remove, clear, sort, contains

 

맵(Map)

 - key, value 형태로 데이터를 저장하는 자료형  ex) HashMap

관련 메소드 : put, get, size, remove, containsKey

 

제네릭스(Generics)

 - <>를 이용해 자료를 명시적으로 지정. 제한적일 수 있지만 안정성을 높여주고 형변환을 줄여줌

 

 

연산자

 - 항과 연산자 : 단항 연산자, 이항 연산자, 삼항 연산자

 - 대입 연산자(=), 부호 연산자(+, -)

 - 산술 연산자 (+, -, *, /, %), 증가/감소 연산자(++, --)

 - 관계 연산자(>, <, >=, <=, ==, !=)

 - 논리 연산자(&&, ||, !)

 - 복합 대입 연산자(+=, -=, %= 등)

 

 - 비트 논리 연산자(&, |, ^, ~)

 - 비트 이동 연산자(<<, >>, >>>) : >>>의 경우 부호 비트 상관 없이 0으로 채움

관련 메소드 : Integer.toBinaryString

 

조건문 : if, switch

반복문 : for, foreach, while, do ... while

 

 

클래스(Object) : 객체를 정의하는 설계도

객체(Object) : 실체

인스턴스(Instance) : 클래스와 객체의 관계. 클래스로부터 객체를 선언하는 것을 인스턴스화라고 한다. 어떤 객체는 어떤 클래스의 인스턴스이다.

 

생성자(Constructor) : 객체가 생성될 때 자동으로 호출된다. 

this, this() : this는 객체 자신을 의미하고 this()는 생성자를 의미한다.

 

오버로딩(Overloading) : 한 클래스 내에 같은 이름의 메소드를 여러 개 정의하는 것

 - 조건

1. 메소드의 이름이 같아야 함.

2. 매개변수의 개수 또는 타입이 달라야 함(리턴 타입의 차이로는 오버로딩 되지 않음).

 

접근제어자 : 클래스의 변수나 메소드에 제한을 두는 키워드

 - private : 해당 클래스에서만 접근 가능

 - public : 어디서든 접근 가능

 - default : 해당 패키지 내에서만 접근 가능

 - protected : 해당 패키지 및 상속받은 클래스에서 접근 가능

 

Static : 변수나 메소드의 특성을 바꾸는 키워드

 - 특징 : 메모리에 한 번만 할당됨. 즉, Static 변수나 메소드는 공유되는 특성을 가짐

 - Static 클래스 변수 : 해당 클래스의 각 개체들이 값을 공유

 - Static 클래스 메소드 : 객체를 생성하지 않아도 호출 가능

 

상속(Inheritance) : 기존 클래스에 기능 추가 및 재정의하여 새로운 클래스를 정의

 - 부모 클래스 : 상속 대상이 되는 기존 클래스(=상위 클래스, 기초 클래스)

 - 자식 클래스 : 기존 클래스를 상속하는 클래스(=하위 클래스, 파생 클래스)

 - 특징

1. 부모 클래스의 필드와 메소드가 상속된다. 단, 생성자, 초기화 블록은 상속되지 않는다.

2. 다중 상속은 불가능하다

3. private, default 멤버는 자식 클래스에서 접근 불가능하다. default의 경우, 내부 패키지의 자식 클래스는 가능하다.

 - super : 부모 클래스와 자식 클래스의 멤버 이름이 같을 때 구분하는 키워드

 - super() : 부모 클래스의 생성자 호출

 

오버라이딩(Overriding) : 부모 클래스의 메소드를 자식 클래스에서 재정의

 - 조건

1. 메소드의 선언부는 부모 클래스의 메소드와 동일해야 함

2. 반환 타입에 한해, 부모 클래스의 반환 타입으로 변환할 수 있는 타입으로 변경 가능.

3. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경 불가

4. 부모 클래스의 메소드보다 더 큰 범위의 예외 선언 불가

 

다형성(Polymorphism)

 - 한 객체가 여러 가지 타입을 가질 수 있는 것

 - 부모 클래스 타입의 참조 변수로 자식 클래스 인스턴스 참조

 

 * 업캐스팅 : 자식 클래스의 객체가 부모 타입으로 형 변환되는 것

 * 다운캐스팅 : 원래 자기 객체가 부모 타입으로 형 변환된 것을 다시 자신의 클래스 쪽으로 형 변환시켜 주는 것이다.

 

instanceof : 실제 참조하고 있는 인스턴스의 타입 확인.  // 다형성을 쓸 수 있는지 없는지 판별하는 도구

 

 

추상 메소드(Abstract Method)

 - 자식 클래스에서 반드시 오버라이딩 해야 하는 메소드

 - 선언만하고 구현 내용이 없음

 

추상 클래스(Abstract Class)

 - 하나 이상의 추상 메소드를 포함하는 클래스

 - 반드시 구현해야 하는 부분에 대해 명시적으로 표현

 - 추상 클래스 자체는 객체 생성 불가

 

인터페이스(Interface)

 - 다중 상속처럼 사용할 수 있는 기능

 - 추상 메소드와 상수만으로 이루어짐

 

내부 클래스(Inner Class) : 클래스 안에 선언한 클래스

 - 특징

1. 내부 클래스에서 외부 클래스 멤버에 접근이 가능함.

2. 외부에서는 내부 클래스에 접근이 불가

 - 종류

1. 인스턴스 클래스(instance class) : 바깥 클래스를 만들어야 사용할 수 있는 형태

2. 정적 클래스(static class) : 내부 클래스에 static이라는 키워드가 붙어서 메모리에 바로 상주되는 클래스. 바깥 클래스가 만들어지지 않아도 바로 사용 가능하다.

3. 지역 클래스(local class) : 클래스 안의 어떤 메소드 안에 클래스가 있는 형태

4. 익명 클래스(anonymous class) : 이름을 가지지 않는 클래스. 선언과 동시에 객체를 생성된다. 일회용 클래스이다.

 

 

콘솔 입력 방법

1. Scanner : 매개변수로 System.in을 넣고 사용하면 된다.

2. System.in.read() : 문자를 하나만 읽어온다. 아스키 문자이기 때문에 만약 문자인 숫자를 숫자로 받으려면 -'0'를 해주어야 한다. 입력에서 enter key를 누르면 입력에 enter key가 남기 때문에 System.in.read(new byte[System.in.available()]);처럼 스트림에 남아 있는 코드를 바이트로 읽어서 처리해주든가 해야한다.

3. inputStreamReader : 매개변수로 System.in을 넣어줘야 한다. 여러 개의 문자를 받아올 수 있고 그 값을 받아올 배열이 필요하다.

4. BufferedReader : 매개변수로 InputStreamReader를 넘겨줘야 한다. 한 라인씩 읽을 수 있다.

 

System.out.print("입력: ");
int a = System.in.read() = '0';
System.out.println("a = " + a); // a = 1
System.in.read(new byte[System.in.available()]);

InputStreamReader reader = new InputStreamReader(System.in);
char[] c = new char[3];
System.out.print("입력: ");
reader.read(c);
System.out.println(c);

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("입력: ");
String s = br.readLine();
System.out.println(s);

Scanner sc = new Scanner(System.in);
System.out.println(sc.nextLine());

 

 * 같이 자주 사용되는 형변환 메소드 : Integer.parseInt(), Integer.valueOf() (Wrapper 객체 반환), Integer.toString()

 

 

콘솔 출력 방법

1. System.out.println()

2. System.out.print()

3. System.out.printf() : d(정수), o(8진수), x(16진수), f(부동소수점), c(문자), s(문자열), %5d(공간 5개를 차지한 뒤 숫자 표현), %.2f(3번째 자리에서 반올림하여 2번째 자리까지 표현)

 

 

파일 출력

1. FileWriter : 매개변수로 파일 경로 지정해주면 된다. 두 번째 매개변수는 이어쓰기와 관련있다.

2. PrintWriter : 매개변수로 파일 경로 지정해주면 된다. 이어 쓰기를 할 땐 FileWriter를 이어쓰기 모드로 선언해서 매개변수로 넣어줘야 한다.

3. FileOutputStream

 

파일 입력

1. BufferedReader : 매개변수로 FileReader를 넣어주면 파일에서 읽을 수 있다.

2. FileInputStream

 

// 파일 쓰기
FileWriter fw = new FileWriter("./memo.txt");
String memo = "헤드 라인\n";
fw.write(memo);

memo = "1월 1일 날씨 맑음\n";
fw.write(memo);

fw.close();

PrintWriter pw = new PrintWriter("./memo.txt");
memo = "헤드 라인";
pw.println(memo);

memo = "1월 1일 날씨 맑음\n");
fw.write(memo);

pw.close();

// 파일 이어 쓰기
FileWriter fw2 = new FileWriter("./memo.txt", true);

memo = "1월 2일 날씨 완전 맑음\n";
fw2.write(memo);

fw2.close();

PrintWriter pw2 = new PrintWriter(new FileWriter("./memo.txt", true));

memo = "1월 3일 날씨 흐림\n";
pw2.println(memo);
pw2.close();

// 파일 읽기
BufferedReader br = new BufferedReader(new FileReader("./memo.txt"));

while (true) {
    String line = br.readLine();
    if (line == null) break;

    System.out.println(line);
}

br.close();

 

예외(Exception)

 - 정상적이지 않은 케이스

ex) 0으로 나누기, 인덱스 초과, 없는 파일 등

 

예외 처리(Exception Handling)

 - 정상적이지 않은 Case에 대한 적절한 처리 방법

 

finally : 예외 발생 여부와 관계없이 항상 실행되는 부분

throw : 예외를 발생시킴

throws : 예외를 전가시킴

 

try {
    ...
} catch(예외 case 1) {
    ....
} catch(예외 case 2) {
    ....
}

... 함수이름() {
    throw new Exception();
}

... 함수이름() throws Exception {
    ...
}

 

 

Collection Framework : 여러 데이터를 편리하게 관리할 수 있게 만들어 놓은 것

1. List : 순서가 있는 데이터 집합. 데이터의 중복 허용

 - 대표 구현 클래스

1)ArrayList : add, remove, size, contains, indexOf

2)LinkedList : add, addFirst, addLast, remove, removeFirst, removeLast, size

3)Vector

 

2. Set : 순서가 없는 데이터 집합. 데이터의 중복을 허용하지 않음

 - 대표 구현 클래스

1)HashSet : add, remove, size, contains

2)TreeSet : add, remove, clear, first, last, lower, higher

 

3. Map : 키와 값의 쌍으로 이루어진 데이터 집합. 순서를 유지하지 않음

 - 대표 구현 클래스

1)HashMap : put, remove, get

2)TreeMap : put, remove, get, firstEntry, firstKey, lastEntry, lastKey, lowerEntry, higherEntry

 

 

 

 

 

람다 표현식 : 메소드 대신 하나의 식으로 표현한 것. 익명 함수(Anonymous Function)라고도 한다.

 - 장점

1. 일반적으로 코드가 간결해짐

2. 코드 가독성이 높아짐

3. 생산성인 높아짐

 

 - 단점

1. 재사용이 불가능(익명)

2. 디버깅 어려움

3. 재귀함수로는 맞지 않음

 

 

스트림(Stream) : 배열, 컬렉션 등의 데이터를 하나씩 참조하여 처리 가능한 기능

 - for문의 사용을 줄여 코드를 간결하게 함

 - 스트림은 크게 3가지로 구성. Stream 생성, 중개 연산, 최종 연산

ex) 데이터소스객체.Stream생성().중개연산().최종연산();

 

 - 스트림 생성

1. 배열 스트림 : Arrays.stream(arr)

2. 리스트 스트림 : ArrayList list = ~; list.stream();

 

 - 중개 연산

1. Filtering : filter 내부 조건에 참인 요소들을 추출

2. Mapping : map 안의 연산을 요소별로 수행

 

 - 스트림 최종 연산 : sum, average, min, max, forEach

 - 스트림은 최종 연산을 만나면 더 이상 스트림 연산을 할 수 없고 종료된다.

 

// 1-1 배열 스트림
System.out.println("== 배열 스트림 ==");
String[] arr = new String[]{"a", "b", "c"};

System.out.println("== fori ==");
for (int i = 0; i < arr.length; i++) System.out.println(arr[i]);

System.out.println("== forEach ==");
for (String item : arr) System.out.println(item);

System.out.println("== to Stream ==");
Stream stream1 = Arrays.stream(arr);
stream1.forEach(System.out::println);


// 1-2 컬렉션 스트림
System.out.println("== 컬렉션 스트림 ==");
ArrayList list1 = new ArrayList(Arrays.asList(1, 2, 3));
System.out.println(list1);

Stream stream2 = list1.stream();
// stream2.forEach(System.out::println);
stream2.forEach(num -> System.out.println("num = " + num));

// 1-3 stream builder
System.out.println("== 스트림 builder ==");
Stream streamBuilder = Stream.builder().add(1).add(2).add(3).build();
streamBuilder.forEach(System.out::println);

// 1-4 stream generate
System.out.println("== 스트림 generate ==");
Stream streamGenerate = Stream.generate(() -> "abc").limit(3);
streamGenerate.forEach(System.out::println);

// 1-5 stream iterate
System.out.println("== 스트림 iterate ==");
Stream streamIterate = Stream.iterate(10, n -> n * 2).limit(4);
streamIterate.forEach(System.out::println);


// 1-6 기본 타입 스트림
System.out.println("== 기본 타입 스트림 ==");
IntStream intStream = IntStream.range(1, 5); // 끝 수를 포함하고 싶다면 rangeClosed 사용
intStream.forEach(System.out::println);


// 2. 스트림 중개 연산
System.out.println("== Filtering ==");
IntStream intStream2 = IntStream.range(1, 10).filter(n -> n % 2 == 0);
intStream2.forEach(System.out::println);

System.out.println("== Mapping ==");
IntStream intStream3 = IntStream.range(1, 10).map(n -> n * n);
intStream3.forEach(n -> System.out.print(n + " "));
System.out.println();

System.out.println("== Sorting ==");
IntStream intStream4 = IntStream.builder().add(5).add(1).add(3).add(4).add(2).build();
IntStream intStreamSort = intStream4.sorted();
intStreamSort.forEach(System.out::println);


// 3. 최종 연산

// 3-1. Sum, Average
System.out.println("== sum, average ==");
int sum = IntStream.range(1, 5).sum();
System.out.println("sum = " + sum);
double average = IntStream.range(1, 5).average().getAsDouble();
System.out.println("average = " + average);

// 3-2. Min, Max
System.out.println("== min, max ==");
int min = IntStream.range(1, 5).min().getAsInt();
System.out.println("min = " + min);
int max = IntStream.range(1, 5).max().getAsInt();
System.out.println("max = " + max);

// 3-3. reduce
System.out.println("== reduce ==");
Stream<Integer> stream3 = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5)).stream();
System.out.println(stream3.reduce((x, y) -> x + y).get());

// 3-4. forEach
System.out.println("== forEach ==");
IntStream.range(1, 10).filter(n -> n == 5).forEach(System.out::println);

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함