JAVA란? |
객체 지향 프로그래밍 언어(1996년 썬 마이크로 시스템즈)
자바 특징
1) 운영체제에 독립적 (JVM을 통해 간접적으로 OS에 접근함)
2) 객체지향 언어 (상속, 다형성, 추상화, 캡슐)
3) 자동 메모리 관리 (가비지 컬렉션)
4) 멀티 쓰레드 (Thread, Runnable)
객체지향과 절차지향의 차이 |
절차지향: 절차대로 프로그래밍하는 방법
객체지향 프로그래밍(OOP): 실생활 물체를 객체로 표현하고, 이들간의 관계, 상호작용을 프로그램으로 나타냄
* 객체 : 변수와 메소드를 가진 것(선언 된 것)
* OOP 장점 : 재사용성, 생산성, 모델링, 유지보수
* OOP 단점 : 개발속도, 코딩 난이도
상속 (IS-A관계) : OOP(객체지향프로그래밍)의 1번째 특징
부모 클래스의 변수/메소드를 자식 클래스가 물려받아 그대로 사용하는 것
장점 : 중복 코드를 줄일수 있다. 유지보수가 쉬움, 다형성 구현 가능
상속(IS-A)과 합성(HAS-A) : 상속(is-a 관계) : 부모 클래스의 속성 및 동작을 자식 클래스에 상속하는 것
ex) 자동차는 자동차다.
확장(has-a 관계) : 클래스가 구성원의 데이터로 다른 클래스의 객체를 포함하는 것
ex) 자동차는 엔진이 포함되어 있다.
* extends 키워드를 통해 물려받음
*부모클래스를 슈퍼클래스, 상위클래스라고 부름
*자식클래스를 서브클래스, 하위클래스라고 부름
캡슐화 : OOP의 2번째 특징
중요한 데이터를 보존하기 위해 변수와 클래스를 하나로 묶는 집합
1) 멤버 변수 앞에 private 접근 제어자 붙인다.
2) set/get 메서드를 통해 변수에 접근 가능한 메서드를 만든다.
3) 은닉화란 ? 내부를 은닉 한다.
다형성 : OOP의 3번째 특징
같은 자료 형에 여러가지 객체를 대입하여 다양한 결과를 나타내는 것
//한 타입의 변수로 여러 타입의 객체를 참조할 수 있도록
* 오버로딩 : 메서드가 같은 이름을 가지고 있으나 매개 변수가 다르게 재정의
* 오버라이딩 : 부모 클래스의 메서드를 자식 클래스에서 재정의
* 업캐스팅 : 자식 클래스가 부모 클래스로 형변환하는 것
* 다운캐스팅 : 부모 클래스가 자식 클래스로 형변환하는 것
추상화 : OOP의 4번째 특징
추상화 정의:여러 객체에 공통적으로 사용되는 내용을 뽑아내는것
+) 인터페이스에 의존하고 구체적인 구현에는 의존하지 않는 것
클래스란? |
유사한 특징을 지닌 객체들의 속성을 묶어 놓은 집합체
클래스와 객체 / 인스턴스 차이
클래스(설계도) : 같은 속성을 지닌 변수와 메소드의 집합
객체 (구현할 대상) : 클래스의 인스턴스, 클래스가 타입으로 선언됐을 때 객체
인스턴스(구체적 실체) : 객체가 메모리에 할당되어 실제 사용될 때 ‘인스턴스’라고 부른다.
추상클래스와 인터페이스 |
추상클래스 : 하나 이상의 추상 메서드를 가진 클래스
목적: 추상클래스를 상속받아(extends) 기능을 이용하고 확장시키기 위함
형태 : 일반메서드 + 추상메서드 가능
특징: 메서드의 부분적인 구현 가능 , 다중 상속 불가
추상메서드: 선언만 하고 구현은 하지 않은 메서드 (반드시 재정의 필요)
인터페이스란? (추상클래스와 비교 필요)
정의: 추상메서드와 상수만을 포함한 클래스
목적 : 구현 객체의 같은 동작을 보장하기 위함
형태 : 상수 + 추상메서드 가능
특징: 메서드 선언만 가능, 다중상속 가능
인터페이스 상속
상속받을 서브클래스(자식)에게 구현할 메서드의 원형을 알려주고
클래스가 자신의 목적에 맞게 메서드를 구현
자바 메모리 구조 |
Call by Value, Call by Reference
Call by Value : 함수 호출 시 인자로 전달되는 값 복사해서 인자 전달
Call by Reference : 인자로 전달되는 변수의 레퍼런스(주소값) 전달
자바 메모리 구조: Static, Stack, Heap 영역으로 구분
- Static 영역
전역변수, static변수 저장
프로그램의 시작부터 종료가 될 때까지 메모리에 남아있다
- Static(전역변수)
클래스가 메모리에 올라갈 때 자동 생성
공통 적으로 공유
인스턴스 생성 없이 바로 사용 가능
객체가 사라져도 멤버는 사라지지 않는다
가비지 컬렉터 관여 불가
- Stack 영역
메소드 내에서 정의 된 기본 자료형, 지역변수, 데이터 값 저장
메소드가 호출될 때 메모리에 할당, 종료되면 메모리 해제
* 각각의 쓰레드는 자신만의 스택영역을 가진다.
- Heap 영역
참조형 데이터 타입을 갖는 객체, 배열(Class,Interface,Array)등은 Heap영역에 데이터 저장
변수는 Stack영역의 공간에서 Heap 영역의 참조 값을 가져옴
오브젝트 타입(Integer, String, ArrayList) 는 heap 영역에 생성됨
자바 메모리 관리
가비지 컬렉션(Garbage collection)
: 힙영역의 오브젝트 중 스택영역에 도달할 수 없는 것을 가비지 컬렉션을 담당하는 프로세스가 자동으로 메모리 해제한다.
* 객체가 NULL이거나 부모 객체가 NULL인 경우 메모리 해제
* Mark & Sweep 과정을 통해 메모리를 관리한다.
[예시] String url = "https://";
url += "yaboong.github.io";
Mark:Garbage Collector가 스택의 모든 변수를 스캔하여 어떤 오브젝트를 레퍼런스하고 있는지 찾는 과정
Sweep: Mark되어있지 않은 모든 오브젝트들을 힙에서 제거한다.
위의 경우 힙영역에 String형태의 “http://yaboong.github.io”만 있고 “http://” 가 쓸모없어졌으므로 힙에서 제거
접근제어자 |
- private : 자기 클래스 내부의 메서드에서만 접근 허용
- protected : 같은 패키지 내부 또는 상속받은 자식 클래스에서 접근 허용
- public : 모든 접근 허용
- default : 같은 패키지 내부에서 접근 허용
final |
final
변수나 메서드 또는 클래스가 ‘변경 불가능’ 하도록 만드는 것
- 원시(Primitive) 변수에 적용 시
해당 변수의 값은 변경이 불가능하다.
ex) static final double PI = 3.14;
- 참조(Reference) 변수에 적용 시
참조 변수가 힙(heap) 내의 다른 객체를 가리키도록 변경할 수 없다.
- 메서드에 적용 시
메서드가 final로 지정되면 해당 메서드를 오버라이드할 수 없다.
- 클래스에 적용 시
해당 클래스의 하위 클래스를 정의할 수 없다.
finally / finalize()
finally: 예외와 상관없이 try / catch 블록이 종료되면 finally 실행됨
[예시]
try { //code }
catch (IOException e) { //code }
finally { // 항상 실행됨 }
finalize(): 가비지 컬렉터가 더이상 참조되지 않는 객체를 메모리에서 삭제하겠다고 하는 순간 호출
자바 인터프리터 |
자바 인터프리터는 클래스 파일 내의 바이트 코드를 기계어로 번역한다.
* 컴파일러는 모든 코드를 적재시켜 실행,
.java파일을 바이트 코드로 번역하여 .class 파일을 생성한다.
동적바인딩이란 ?
실행시점에 객체 타입을 기준으로 실행될 함수를 호출하는 것.
(실행 시점에 뭔가를 결정하는 것)
프로그램 실행 전에 결정되지 않는 것을 말한다.
ex) 동적할당주소, 동적할당변수
자바에서 묵시적 형 변환과, 명시적 형 변환의 차이
묵시적 형 변환 : 자동으로 형 변환 해주는 것
명시적 형 변환 : 데이터 앞에 변환할 타입으로 명시해주는 것
자바 스레드와 프로세스의 차이
프로세스 : 메모리에 적재되어 실행 중인 프로그램
스레드 : 프로세스의 실행단위, 프로세스 내 주소공간이나 자원 공유
자바 예외와 에러의 차이
에러(Error) : 사용자의 잘못된 연산, 입력 / 개발자의 잘못된 로직에 의해 발생함
* 컴파일 시 문법적 오류 발생하는 경우
- OutofMemory Error, StackOverflow Error
예외(Exception) : 시스템 동작 중 예기치 않은 상태가 발생해 프로그램이 영향을 받는 것
- try-catch 구문으로 개발자가 처리할 수 있기 때문에 예외 처리하는 것이 중요
- Checked Exception : 예외처리가 필수, ex) IOException
- Unchecked Exception : 컴파일시 체크되지 않고 런타임시 발생
ex) NullPointerException
+) Throwable 클래스 : 예외처리(Error, Exception) 가능한 최상위 클래스
Java SE, Java EE |
자바 스탠다드 에디션(SE)는 가장 보편적으로 쓰이는 자바 API의 집합체이다.
그리고 EE는 SE스펙 기반으로 자바를 이용한 서버측 개발을 위한 플랫폼으로 둘의 차이는 API에 추가로 들어있는 JAR파일들의 차이이다.
Java SE(Java Platform Standard Edition)
: 표준 자바 플랫폼, JDBC등 모두 포함하여 Android 개발시 주로 SE 사용
Java EE (Java Platform EnterPrise Edition)
: 서버측 개발을 위한 플랫폼 , JSP/Servlet/JDBC/EJB 등의 기능 제공
Java ME(Java Platform Micro Edition)
: 임베디드를 위한 자바 플랫폼, 휴대폰,셋톱박스 개발을 위한 자바 플랫폼
Java ME는 무엇인가
자바 ME는 휴대폰, PDA 셋톱박스 등 제한된 자원을 가진 디바이스에서 자바 언어를 지원하기 위해 만들어진 플랫폼이다. 임베디드 시스템에서 자바로 개발을 진행할 때 이용된다.
자바 주요 인터페이스 |
List<E> : Vector, ArrayList, LinkedList, Stack
- 순서가 있는 데이터의 집합, 데이터의 중복 허용
- Collection 인터페이스 상속 받음
Set<E> : HashSet, TreeSet
- 순서가 없는 데이터의 집합, 데이터 중복 허용 X
- Collection 인터페이스 상속 받음
Map<K,V> : HashMap, TreeMap, HashTable, Properties
- 키(Key)와 값(Value)의 한쌍으로 이루어진 데이터의 집합으로, 순서없음
- 키는 중복 허용 X , 값은 중복 허용 가능
HashMap과 HashTable / HashMap과 TreeMap
HashMap<Key,Value> : 비동기, null key와 다수의 null value 허용
- 해시함수를 통해 키와 값이 저장되는 위치 결정 BUT 데이터 정렬 X
HashTable<Key,Value> : 동기, null을 허용하지 않음
TreeMap<Key,Value> : 이진트리 형태로 저장되므로 데이터 정렬됨
*LinkedHashSet : HashSet인데 순서보장되는 자료구조
super 키워드 |
speed = 부모클래스의 필드
System.out.println(super.speed);
부모 클래스로부터 상속받은 필드나 메소드를 자식클래스에서
참조하는 데 사용하는 참조 변수
super()
this->speed
this() 메소드가 같은 클래스의 다른 생성자를 호출할 때 사용된다면,
super() 메소드는 부모 클래스의 생성자를 호출할 때 사용함
this 키워드
객체 자신의 속성을 나타내는 것 .
1) 클래스 속성과 생성자/메소드의 매개변수 같은 경우
→ 밖에 있는 필드와 안에있는 필드를 명시하기 위해 this 키워드 사용
ex) this.name = name;
2) 클래스에 오버로딩된 다른 생성자 호출
ex) this(name, color, 0,0); 등 클래스 내 생성자에서 다른 생성자 호출
3) 객체 자기 자신의 참조값을 전달하고 싶을 때
ex ) return this;
제네릭(Generic) |
Generic : 일반화된 타입 매개변수로 클래스나 메서드 선언하는 기법
+) 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법
+) 클래스를 선언할 때 타입을 결정하지 않고
객체를 선언할 때 유동적인 타입으로 재사용하기 위한 것
class Car<T> // C++에서
Template{
T name ; //Integer, String
}
Wrapper 클래스 |
기본 타입 데이터(int, char)를 객체로 포장해 주는 클래스
산술 연산을 위해 정의 된 클래스가 아님 따라서 인스턴스에 저장된 값 변경불가
(값을 참조하기 위해서는 새로운 인스턴스 생성하고, 생성 된 인스턴스 값 참조)
- 이유
프로그램에 따라 기본 타입의 데이터를 객체로 취급해야 하는 경우가 있음
- 종류
Byte(byte), Short(short), Integer(int), Long(long), Float(float), Double(double), Character(char), Boolean(boolean)
Boxing, unBoxing
boxing : 기본 타입을 래퍼 클래스의 인스턴스로 변환하는 과정,
생성자 또는 valueOf 팩토리 메서드 통해 변환
예) int -> Integer / char -> Character
unboxing : 래퍼 클래스의 인스턴스에 저장된 값을 다시 기본 타입으로 꺼내는 과정
예) Integer -> int / Character -> char
오토 박싱, 오토 언박싱
오토박싱 : 원시타입에서 참조타입으로 자동으로 변경
오토언박싱: 참조타입에서 원시타입으로 자동으로 변경
JDK 1.5부터는 박싱과 언박싱이 필요한 상황에 자바 컴파일러가 자동으로 처리
String |
String, Stringbuilder, Stringbuffer
string : immutable(불변) ,연산이 많을 경우 불리, 한번 할당되면 할당된 메모리 공간이 변경되지 않는다.(짧은 문자열 더할 경우 사용)
StringBuilder : 단일스레드에서만 가능, 스레드에 안전한 프로그램 개발 시 사용됨
StringBuffer : mutable(변함), 멀티스레드 환경에서 동기화 가능, 연산이 많을 경우 유리
trim
string의 왼쪽 오른쪽 공백을 제거 시켜 줌
“ 문자열 공백 ” -> “문자열 공백”
reverse
배열, string, list 등을 거꾸로 뒤집어 줌
스트림
순서가 있는 데이터의 연속적인 흐름
* 직렬화 : 객체를 스트림을 통해 입출력하기 위해 바이트 배열 형태로 바꾸는 것
* 역직렬화 : 스트림을 통해 받은 직렬화 객체를 원래 모양으로 바꾸는 것
바이트 스트림
데이터 종류가 파일, 그림, 동영상 인경우 바이트 단위로 입출력을 제어한다.
NullPointerException
NULL값을 참조하는 경우
Thread 클래스(스레드 클래스, 화이트박스 방식)
자바에서 스레드를 만들기 위해 Thread class 상속함
* Thread pool :
필요시 스레드를 가져오거나 이전 코드에서 실행완료되었을 때 재사용
(새로운 스레드 생성X)
멀티스레드
여러 스레드를 동시에 실행시키는 응용프로그램을 작성하는 기법
장점 : 메모리 공유를 통해 시스템 자원 소모가 줄어든다.
단점 : 자원을 소모하다가 충돌이 일어날 수 있음
스레드의 동기화(synchronized)
멀티쓰레드 프로세스의 경우 자원을 공유해서 작업하므로 서로 작업에 영향을 줌
synchronized를 통해 해당 작업과 관련된 공유 데이터에 Lock을 걸어서 먼저 작업중이던 스레드가 작업 마칠때까지 다른 쓰레드에게 제어권이 넘어가더라도 데이터가 변경되지 않도록 보호함
[예시] 특정객체에 Lock을 걸고자 하는 경우
synchronized(객체의 참조변수){
//code
}
//지정된 객체는 synchronized블럭의 시작부터 Lock걸렸다가 끝나면 Lock이 풀린다.
//이 블록을 수행하는 동안 Lock이 걸려서 다른 쓰레드가 이 객체에 접근 불가하다.
[예시] 메서드에 Lock을 걸고자 하는 경우
public synchronized void calcSum(){
//code
}
//그냥 딴 애 못쓰게 나 다 쓰면 써라라고 synchronized 키워드 걸어놓는 것
//한 쓰레드가 synchronized 메소드를 호출해 수행하고 있으면,
//메서드가 종료될 때까지 다른 쓰레드가 이 메서드를 호출하여 수행할 수 없음
Runnable 인터페이스 (블랙박스방식) |
Thread class와 같이 자바에서 스레드 실행시키는 인터페이스
인터페이스를 상속받은 자식클래스는 다른 클래스를 상속받을 수 있다.
다중상속이 지원되기 때문에 Thread clas보다 많이 쓰임
구현 : run()함수를 통해 구현됨
//그냥 스레드 만드는 데 다중상속 지원하도록 인터페이스로 정의한 듯합니다.
concat
JVM : 컴파일러가 .java 파일을 Java byte code인 .class 파일로 변환시켜줌
JVM은 class 파일을 OS가 이해할 수 있도록 기계어로 변환
즉, JVM 덕분에 OS에 종속적이지 않음
람다식 |
메서드를 하나의 식으로 표현한 것
메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로 람다식을 익명함수(anonymous function)라고도 한다.
[기존]
int max(int a, int b) {
return a > b ? a : b;
}
[람다식]
(int a, int b) -> {
return a > b ? a : b;
}