
📃 요약
자바는 웹 프로그램을 개발하는데 특화된 컴파일 언어이자 벡엔드 개발 전문 언어임. 플랫폼에 독립적이라서 어떤 운영체제(OS)에서도 실행이 가능하며 가상머신을 통해 실행됨
요소 기술 :
Basic : 자바
📃 기술 구현
스펙 :
intellij java
📃 주요 자바API
자바에서 코딩시에 활용할 수 있는 유용한 함수를 제공함. 이것을 API 함수라고 함
1) Object 클래스 :
- 자바의 최상위 부모 클래스, 모든 자바 객체에서 사용가능( 자동 상속되고, extends 키워드는 생략됨 ),
- 기본적인 함수들이 있음(.equals(), .hashCode(), .toString() 등)
(1) .equals() 함수 :
- 객체를 동등 비교 : 객체가 동등하다는 것은 2개의 속성이 같다라는 뜻
- String 객체를 제외한 모든 객체는 .equals() 함수르 쓰면 주소(방번호) 비교를 하기때문에 재정의해서 사용해야 함
- String 객체는 .equals() 값비교가 됨( String 에서 재정의 되어 있음 : 자바에서 미리 재정의함 )
Member.java
public class Member {
// 속성
public String id;
public Member(String id) {
this.id = id;
}
// Object : 객체의 최고 조상(부모) 클래스
// 객체의 .equals 함수 재정의
@Override
public boolean equals(Object obj) {
if(obj instanceof Member) {
// 강제 형변환
Member member =(Member)obj;
// 속성의 id 값 매개변수값 id를 비교해서 같은면 true
// 틀리면 false
if(this.id.equals(member.id)) {
return true;
}
}
return false;
}
}
MemberApplication.java
public class MemberApplication {
public static void main(String[] args) {
Member member = new Member("blue"); // 방번호(주소) 1
Member member2 = new Member("blue"); // 방번호(주소) 2
Member member3 = new Member("red");
// 객체 비교 시 .equals 방번호(주소) 비교
if(member.equals(member2)) {
System.out.println("member 와 member2는 같습니다.");
} else {
System.out.println("member 와 member2는 다릅니다.");
}
}
}
(2) .hashCode() 함수 :
- 객체를 식별하는 유일한 정수값
1) 번호는 중복되면 안됨,
2) 주로 방번호(주소값)으로 해쉬코드를 사용함
3) 해쉬코드를 자동으로 만들어주는 해쉬함수에 의해 구해짐 - HashMap, HashSet 라는 자료구조는 해쉬코드로 객체 비교를 하기때문에 재정의해서 사용해야 함
- 해쉬코드 재정의 : 객제 2개가 같다라는 것을 정의하기 위해 사용.
1) 주로 속성의 값이 항상 같도록 결과 내보내기함
Member.java
public class Member {
// 속성
public String id;
public Member(String id) {
this.id = id;
}
// Object : 객체의 최고 조상(부모) 클래스
// 객체의 .equals 함수 재정의
@Override
public boolean equals(Object obj) {
if(obj instanceof Member) {
// 강제 형변환
Member member =(Member)obj;
// 속성의 id 값 매개변수값 id를 비교해서 같은면 true
// 틀리면 false
if(this.id.equals(member.id)) {
return true;
}
}
return false;
}
// 해쉬코드 재정의
// id속성이 2개가 같으면 해쉬코드도 같음
// String 객체의 특징 : 문자열이 같으면 같은 방번호를 씀
@Override
public int hashCode() {
return id.hashCode();
}
}
(3) .toString() 함수 :
- 객체를 문자열로 변환하는 함수
- 객체만 출력함수에 매개변수(인자)로 넣어도 자동으로 .toString() 함수가 실행됨(생략가능)
- 객체의 속성(필드) 정보 출력하기.
1) 객체의 핵심 정보는 속성(필드)임
2) 재정의 않하면 객체 출력시 방번호(주소값)가 출력됨(배열과 같음)
3) 재정의 대상 : 객체의 속성이 출력되도록 재정의함
SmartPhone.java
public class SmartPhone {
private String company;
private String os;
public SmartPhone(String company, String os) {
this.company = company;
this.os = os;
}
// toString() 재정의
// 속성의 값을 볼수 있게 함수 재정의
@Override
public String toString() {
return this.company + "," + this.os;
}
}
SmartPhoneApplication.java
public class SmartPhoneApplication {
public static void main(String[] args) {
SmartPhone smartPhone = new SmartPhone("구글", "안드로이드");
// .toString() 함수 : 객체를 문자열로 변환하는 함수
// 출력 : 패키지명+클래스명@16진수해쉬코드
// 개발자 기대하는 출력 : 속성의 값들을 보고 싶다.
System.out.println(smartPhone.toString());
}
}
2) Wrapper 클래스 :
- 기본 자료형 : byte, short, int, long, float, double, char, boolean
- 위의 자료형을 객체로 변환해야 할때가 있음
- 주로 표기할때 풀네임(Full Name)으로 사용하고 첫글자로 대문자를 사용함
1) int -> Integer
2) long. -> Long
3) double -> Double
4) boolean -> Boolean
5) char -> Charater
6) 기타 등등 - Boxing : 기본자료형 -> 객체 변환
- UnBoxing : 객체 -> 기본자료형
- 과거에는 특정 함수를 이용해서 Boxing/UnBoxing 했지만, 지금은 함수사용하지 않고 바로 사용가능
BoxingApplication.java
public class BoxingApplication {
public static void main(String[] args) {
// 기본 자료형 : byte, short, int, long, float, double, char, boolean
// 위의 자료형을 객체로 변환해야 할때가 있음
// int -> Integer 객체 있음
// double -> Double 객체 있음
// boolean -> Boolean 객체 있음
// 기본자료형 -> 객체 변환 : Boxing
Integer obj1 = new Integer(100); // 객체 정수형(Wrapper Class), 옛날방식
Integer obj2 = 100; // 기본자료형 -> 객체 자동변환(AutoBoxing), 요즘방식
// 객체 -> 기본자료형 : UnBoxing
int value1 = obj1.intValue(); // 원복
int value2 = obj2; // 자동 변환(객체 -> 기본자료형)
System.out.println(value1);
System.out.println(value2);
}
}
📃 컬렉션(자료구조) 프레임워크
널리 알려진 자료구조를 사용해서 만들어 놓은 클래스
1) 자료구조 :
- 자료(데이터)들을 효율적으로 사용하기 위한 구조(방)를 말함
- 배열이 가장 쉬운 자료구조이며 이것을 개선한 여러가지 자료구조가 있음
2) 컬렉션 프레임워크 :
- 널리 알려져 있는 자료구조를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 만들어 놓은 클래스들
- 대표적으로 List, Set, Map 이 있음
3) List :
- 배열을 개선한 자료구조(컬렉션)로 인덱스번호를 내부에 가지고 있음
- 추가/삭제/검색을 위한 다양한 함수들을 제공함
특징 :
1) 순서가 있음(index 번호)
2) 중복 저장 허용
3) 구현 클래스는 ArrayList(*), LinkedList, Vector 가 있음
4) ArrayList 는 순차적으로 추가/삭제 시 성능이 좋음
5) LinkedList 는 중간에 추가/삭제 시 성능이 좋음
6) Vector 는 멀티쓰레드 환경에서 사용하는 자료구조임
public class ArrayListApplication {
public static void main(String[] args) {
// 다형성 : 인터페이스(부모) 변수명 = new 구현클래스();
// list 객체 <- ArrayList , Vector, LinkedList
// <제한할자료형> : 제네릭 , 객체 자료형을 제한하기 위해 사용
List<String> list = new ArrayList<>();
// 개선된 배열 : ArrayList
// 객체.add(문자열) : 개선된 배열에 자료 생성하는 함수
list.add("Java");
list.add("JDBC");
list.add("Servlet/JSP");
list.add(2, "Database");
// JPA/ myBatis : JPA(단순 질의) + myBatis(복잡한 질의)
list.add("myBATIS"); // Springboot framework 데이터베이스 연결하기 위한 용도의 프레임워크
System.out.println(list); // [Java, JDBC, Database, Servlet/JSP, myBATIS]
// 배열 크기 가져오기
int size = list.size();
System.out.println("총 객체수 :" + size);
System.out.println("-------3번째 자료 가져오기");
// 3번째 자료 가져오기
String skill = list.get(2);
System.out.println("3번째 자료 : " + skill);
System.out.println("----------모두 출력하기------------");
// ArrayList 안의 자료 모두 출력하기
for (int i = 0; i < list.size(); i++) {
// 객체.get(인덱스번호) : 인덱스번호에 해당하는 자료 조회하기(검색하기)
String str = list.get(i);
System.out.println(i + " : " + str);
}
System.out.println("-------수정하기--------------");
// 자료 수정하기
list.set(0, "자바");
System.out.println("수정된 값 : " + list.get(0));
System.out.println("----------삭제하기--------------");
// 삭제하기
// 객체.remove(인덱스번호) : 배열의 인덱스번호에 해당하는 자료 삭제하기
// ArrayList : 중간에 삭제되면 뒤에 자료가 그 공간으로 자동 당겨짐
// 중간에 추가되면 뒤로 한칸씩 밀림
list.remove(2);
list.remove(2);
list.remove("myBATIS");
// ArrayList 안의 자료 모두 출력하기
for (int i = 0; i < list.size(); i++) {
// 객체.get(인덱스번호) : 인덱스번호에 해당하는 자료 조회하기(검색하기)
String str = list.get(i);
System.out.println(i + " : " + str);
}
System.out.println("-------------모두 삭제하기---------------");
// 모두 삭제하기
list.clear();
if(list.isEmpty() == true) {
System.out.println("모두 삭제됨");
}
}
}
4) Set : 집합을 구현한 자료구조
특징 :
1) 순서가 없음, 중복 저장 안됨
2) 만약 중복 저장하면 나중값이 들어가지 않음
3) 구현 클래스는 HashSet 이 있음
public class HashSetApplication {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
// .add(객체) : set 자료 추가
set.add("Java");
set.add("JDBC");
set.add("Servlet/JSP");
set.add("Java");
set.add("myBATIS");
System.out.println(set); // [Java, myBATIS, JDBC, Servlet/JSP]
// 자료 크기 보기
int size = set.size();
System.out.println("총 객체수 : " + size);
// 자료 출력
for(String element : set) {
System.out.println("\t" + element);
}
// 자료 삭제하기
set.remove("JDBC");
set.remove("myBATIS");
System.out.println("---------------------------");
// 자료 출력
for(String element : set) {
System.out.println("\t" + element);
}
System.out.println("---------------------------");
// 모두 삭제
set.clear();
// set.isEmpty() : 집합에 자료가 있는지 없는지 검사 , 없으면 true, 있으면 false
if(set.isEmpty() == true) {
System.out.println("비워 있음");
}
}
}
5) Map : (키, 값) 으로 구성된 자료구조(1개를 Entry 라고 함)
특징 :
1) 키는 중복 저장될 수 없지만, 값은 중복 저장될 수 있음
2) 만약 (키, 값)을 중복 저장하면 기존의 값이 나중 값으로 대치됨
3) 구현 클래스는 HashMap(*), HashTable(멀티쓰레드에서 사용) 등이 있음
public class HashMapApplication {
public static void main(String[] args) {
// Map 자료 구조 생성
Map<String, Student> map = new HashMap<>();
// map객체.put(키, 값) : 객체 추가
map.put("신용권", new Student(1,"신용권")); // 1st Entry
map.put("홍길동", new Student(1,"홍길동")); // 2nd Entry
map.put("동장군", new Student(1,"동장군"));
map.put("홍길동", new Student(1,"홍길동"));
System.out.println(map); // {홍길동=Student{sno=1, name='홍길동'}, 신용권=Student{sno=1, name='신용권'}, 동장군=Student{sno=1, name='동장군'}}
// map.size() : map 객체 크기 보기
System.out.println("총 Entry 수 :" + map.size());
System.out.println("----------키에 해당하는 값보기----------");
// map.get(키) : 키에 해당하는 값을 보기
System.out.println("홍길동 :" + map.get("홍길동"));
System.out.println();
System.out.println("----------키만 있는 집합 변경 : 값 출력----------");
// Map -> Set 변환 : 키만 있는 집합
Set<String> keySet = map.keySet();
System.out.println(keySet);
System.out.println("----------향상된 for 문으로 출력:키/값-----------");
// 향상된 for문으로 출력
for (String key:keySet) {
Student student = map.get(key); // 키로 값을 조회
System.out.println(key + " : " + student);
}
System.out.println("---------자료 삭제----------"); // 줄바꿈
// 자료 삭제
map.remove("홍길동");
System.out.println("홍길동: " + map.get("홍길동"));
System.out.println("----------모두 삭제-----------");
// 자료 모두 삭제
map.clear();
if(map.isEmpty() == true) {
System.out.println("모두 삭제되었습니다.");
}
}
}
📃 LIFO 와 FIFO 컬렉션(자료구조)
- 널리 알려진 자료구조 중 자료추가 및 꺼낼 때 순서가 달라지는 자료구조가 있음
- 대표적으로 Stack(스택) / Queue(큐) 가 위와 같이 구조를 가짐
1) Stack(스택) :
- LIFO(Last In First Out, 후입선출) 을 구현한 클래스
- 마지막에 들어간 자료가 먼저 나옴
Coin.java
public class Coin {
private int value;
// 생성자 : alt+insert
public Coin(int value) {
this.value = value;
}
// getter : 속성의 값을 조회하는 함수 (alt + insert)
public int getValue() {
return value;
}
// setter : 속성의 값을 저장하는 함수 (alt + insert)
public void setValue(int value) {
this.value = value;
}
}
StackApplication.java
public class StackApplication {
public static void main(String[] args) {
// 스택 객체 생성
Stack<Coin> coinStack = new Stack<>();
// Coin 객체가 Stack 4개가 들어감
coinStack.push(new Coin(100));
coinStack.push(new Coin(50));
coinStack.push(new Coin(500));
coinStack.push(new Coin(10)); // 먼저 나옴
// 스택객체.isEmpty() : 스택에 자료가 있는지 없는지 확인, 하나도 없으면 true,
// 하나라도 있으면 false
while (!coinStack.isEmpty()) {
Coin coin = coinStack.pop(); // 스택에서 한개(Coin 객체) 꺼내기
// coin.getValue() : Coin 객체의 getter 함수 ( 명명법 : get속성명() )
System.out.println("꺼낸 동전 : " + coin.getValue() + "원");
}
}
}
2) Queue(큐) :
- FIFO(First In First Out, 선입선출) 을 구현한 인터페이스
- 먼저 들어간 자료가 먼저 나옴
- 구현 클래스는 주로 LinkedList를 사용함
Message.java
public class Message {
// 속성
public String command;
public String to;
// 생성자
public Message(String command, String to) {
this.command = command;
this.to = to;
}
}
MessageApplication.java
public class MessageApplication {
public static void main(String[] args) {
// 큐 객체 생성 : 다형성
// 부모인터페이스 변수 = new 자식클래스();
Queue<Message> messageQueue = new LinkedList<>();
// 큐에 자료 저장
// new Message(명령어, Who)
messageQueue.offer(new Message("sendMail", "홍길동"));
messageQueue.offer(new Message("sendSMS", "신용권"));
messageQueue.offer(new Message("sendKakaotalk", "홍두깨"));
// 큐에 내용 출력
// 큐객체.isEmpty() : 큐안에 자료가 있는지 없는지 확인 함수(없으면:true, 있으면:false)
while(!messageQueue.isEmpty()) {
// 자료 한개 꺼내기(Message 객체)
Message message = messageQueue.poll();
switch (message.command) {
case "sendMail":
System.out.println(message.to + "님에게 메일을 보냅니다.");
break;
case "sendSMS":
System.out.println(message.to + "님에게 SMS를 보냅니다.");
break;
case "sendKakaotalk":
System.out.println(message.to + "님에게 카카오톡을 보냅니다.");
break;
}
}
}
}
📃 Arrays / Collections
- Arrays : 고전적 배열에 관련된 유용한 함수들이 있는 클래스
- Collections : 컬렉션 프레임워크(List, Set, Map)에 있는 유용한 함수들이 있는 클래스
- 주로 코딩테스트나 프로젝트 시 활용가능함
1) Arrays :
- Arrays : 고전적 배열에 관련된 유용한 함수들이 있는 클래스
(1) Arrays.toString(배열) / Arrays.deepToString(배열)
사용법 : Arrays.toString(배열) : 1차원 배열의 모든값 문자열로 내보내기(리턴)
사용법 : Arrays.deepToString(배열) : 2차원 배열의 모든값 문자열로 내보내기(리턴)
public class ArraysApplication {
public static void main(String[] args) {
int[] arr = {0,1,2,3,4};
int[][] arr2D = { {11,12,13}, {21,22,23}};
// 사용법 : Arrays.toString(배열) -> 배열의 값이 보임
System.out.println("arr=" + Arrays.toString(arr)); // 1차원 배열 값 보기
System.out.println("arr2D=" + Arrays.deepToString(arr2D)); // 2차원 배열 값 보기
}
}
(2) Arrays.fill(배열, 값)
사용법 : Arrays.fill(배열, 값); 배열의 모든원소를 특정값으로 채우기
public class ArraysApplication {
public static void main(String[] args) {
int[] arr7 = new int[5];
// 사용법 : Arrays.fill(배열, 값); 배열의 모든원소를 특정값으로 채우기
Arrays.fill(arr7, 9); // arr7=[9,9,9,9,9]
System.out.println("arr7=" + Arrays.toString(arr7));
}
}
(3) Arrays.sort(배열, Collections.reverseOrder()) / Arrays.sort(배열)
사용법 : Arrays.sort(배열); 배열의 모든원소를 오름차순 정렬
사용법 : Arrays.sort(배열, Collections.reverseOrder()); 배열의 모든원소를 내림차순 정렬
- 듀얼피봇 퀵정렬 알고리즘 사용 : 변형된 퀵정렬 알고리즘, 이리 정렬된 데이터를 정렬할 경우를 제외하고
빠른 알고리즘 중 1개
public class ArraysApplication {
public static void main(String[] args) {
Character[] chArr = {'A', 'D', 'C', 'B', 'E'}; // char(정렬시 기본자료형 사용못함)
Arrays.sort(chArr, Collections.reverseOrder()); // 내림차순 정렬
System.out.println("chArr=" + Arrays.toString(chArr)); // 정렬된 배열 출력
Arrays.sort(chArr); // 오름차순 정렬
System.out.println("chArr=" + Arrays.toString(chArr)); // 정렬된 배열 출력
}
}
(4) Arrays.binarySearch(배열, 값)
사용법 : Arrays.binarySearch(배열, 값); 배열에서 갑을 찾은 후에 인덱스번호를 내보내기함(리턴)
사용 전에 미리 오름차순 정렬되어 있어야함
public class ArraysApplication {
public static void main(String[] args) {
Character[] chArr = {'A', 'D', 'C', 'B', 'E'}; // char(정렬시 기본자료형 사용못함)
Arrays.sort(chArr); // 오름차순 정렬
System.out.println("B의 인덱스번호 : " + Arrays.binarySearch(chArr, 'B'));
}
}
(5) Arrays.asList(배열)
사용법 : Arrays.asList(배열) : 배열을 리스트로 변환
public class ArraysApplication {
public static void main(String[] args) {
List list = new ArrayList(Arrays.asList(1,2,3,4,5)); // 배열을 리스트로 변환
System.out.println(list); // List 의 값 보기
}
}
2) Collections :
- Collections : 컬렉션 프레임워크(List, Set, Map)에 있는 유용한 함수들이 있는 클래스
(1) Collections.addAll(향상된배열, 배열값)
사용법 : Collections.addAll(향상된배열, 배열값) : 배열값이 향상된배열에 들어감
public class CollectionsApplication {
public static void main(String[] args) {
List list = new ArrayList();
Collections.addAll(list, 1,2,3,4,5);
System.out.println(list);
}
}
(2) Collections.rotate(향상된배열, 오른쪽칸이동)
사용법 : Collections.rotate(향상된배열, 오른쪽칸이동) : 배열값을 오른쪽으로 두 칸씩 이동
public class CollectionsApplication {
public static void main(String[] args) {
List list = new ArrayList();
Collections.addAll(list, 1,2,3,4,5);
// 사용법 : Collections.rotate(향상된배열, 오른쪽칸이동)
Collections.rotate(list, 2);
// [4,5,1,2,3]
System.out.println(list);
}
}
(3) Collections.swap(향상된배열, 원본요소, 바꿀요소)
사용법 : Collections.swap(향상된배열, 원본요소, 바꿀요소) : 원본요소에서 바꿀요소로 값 교환(swap)
public class CollectionsApplication {
public static void main(String[] args) {
List list = new ArrayList();
Collections.addAll(list, 1,2,3,4,5);
// 사용법 : Collections.swap(향상된배열, 원본요소, 바꿀요소)
Collections.swap(list, 0, 2);
System.out.println(list);
}
}
(4) Collections.sort(향상된배열) / Collections.sort(향상된배열, reverseOrder())
사용법 : Collections.sort(향상된배열) : 향상된배열을 오름차순 정렬
사용법 : Collections.sort(향상된배열, reverseOrder()) : 향상된배열을 내림차순 정렬
- Tim 정렬 알고리즘 사용 : 삽입(Insertion) 정렬과 합병(Merge) 정렬을 결합하여 만든 정렬
빠른 알고리즘 중 1개
public class CollectionsApplication {
public static void main(String[] args) {
List list = new ArrayList();
Collections.addAll(list, 2,4,3,1,5);
Collections.sort(list, reverseOrder()); // 내림차순
System.out.println(list);
Collections.sort(list); // 오름차순
System.out.println(list);
}
}
(5) Collections.binarySearch(향상된배열, 검색할값)
사용법 : Collections.binarySearch(향상된배열, 검색할값) : 값을 찾아서 그 위치의 인덱스번호 내보내기(리턴)
- 사용 전 오름차순 정렬되어 있어야 함
public class CollectionsApplication {
public static void main(String[] args) {
List list = new ArrayList();
Collections.addAll(list, 2,4,3,1,5);
Collections.sort(list); // 오름차순
int idx = Collections.binarySearch(list, 3); // 3의 값이 있는 인덱스 위치가 리턴
System.out.println("3의 위치 : " + idx);
}
}
(6) Collections.fill(향상된배열, 채울값)
사용법 : Collections.fill(향상된배열, 채울값) : 값으로 향상된배열을 채움
public class CollectionsApplication {
public static void main(String[] args) {
List list = new ArrayList();
Collections.addAll(list, 2,4,3,1,5);
// 사용법 : Collections.fill(향상된배열, 채울값)
Collections.fill(list, 9);
System.out.println("list=" + list);
}
}



