DBMS : 데이터의 집합인 데이터베이스를 잘 관리하고 운영하기 위한 시스템 or SW

  • 외래키 Foreign key : 데이터 무결성 보장됨
  • 기본 키 Primary key : 행 단위 구분 데이터
  • 제약조건 
    • 새로운 데이터 들어갈 때는 부모 테이블에 먼저 넣어야함
    • 데이터 삭제 시에는 자식 테이블에서도 지워야 함

 

mysql 서버는 자동으로 구동 됨 -> 컴터 키면 

 

  • 워크벤치
    • mysql 관리하는 목적으로 쓰임

Sql

  • DDL
    • 데이터 정의
  • DML
    • 데이터 추가/수정/삭제
  • DCL
    • 데이터 관리, 접근 권한 제어

( ※ DML이 SELECT에 있다는 것은 바라보는 관점에 따라 다름,)

  • 기본키 정의 

이렇게 2가지 방법을 기본키정의를 할수 있다. 

 

  • 부호
    • 단일 인용 부호를 써야한다.
    • 별명일 경우는 더블 쓸 수도 있다 .
INSERT INTO LOCATIONS VALUES ('A1','SEOUL');

 

  • 한글

한글 설정

 

  • 정보 출력
    • desc 테이블 명;
    • 컴럼 사양들 

 

  • 객체를 통해서 사용 : 변수 
  • 메소드 or 함수 -> mysql 내장 함수
    • select user( ) : 현재 내가 어떤 계정으로 접속했는지
    • select database( ); 현재 사용하고 있는 database이름 (use한거)

 

  • DBMS, 서버 환경에 따라 데이터베이스 or 필드명이 대소문자를 구분하기도 함

 

SELECT문

추출하고자하는 데이터베이스

select now() from emp;

from이 emp이지만, now의 결과 14개를 뽑음

 

select now() form dual;

dual -> 테이블 내용 중요하지 않고, 함수의 결과 한번만 출력

그래서 from 없애도 나옴 (mysql은 from 생략 가능)

  • 테이블 내용 출력하는게 아니면 from 생략 가능

(오라클은 from 없애면 안됨)

select sysdate();

sysdate 오라클에서 추가함

 

use 구문

  • 데이터 베이스 사용하겠다.

( * 시간은 ',' 으로 구분되고, 년월일은 '-'아니면 '/'로 구분됨 )

( null 연산하면 null이기 때문에 연산할 때는 따로 바꿔줘야한다 )

 

조회

show table status;
  • 데이터 베이스에 있는 테이블 정보 조회
DESCRIBE EMP;
  • emp 테이블에 열이 무엇이 있는지

 

WHERE 절

등가 연산자 : '='

 

관계 연산자

  • BETEEN ... AND ( BETEEN A AND B ) (A<B)
    • 데이터가 숫자로 구성되어 있으며 연속된 값

 

  • IN( 값의 리스트 ) 
    • 등가 연산자랑 똑같은데, 비교하려는 값이 2개 이상일 때
    • ex) select * from emp where deptno in(20, 30)
      • select * from emo where deptno=20 or deptno=30와 같다.

 

  • Like (패턴 비교)
    • 패턴 문자 : %, _ 
      • % : 0개 이상의 모든 문자
      • _ : 임의의 한 문자
        where title like 'java%' java로 시작하는 얘들만
        where title like '%java%' 중간에 java들어가있는 것
        where title like '%java' 끝이 java로 끝나는 얘들만
        where title like 'java_'  java로 시작하는데 뒤에 한 문자만 와야함
        where title like 'java___' java뒤에 3개가 와야함 
      • where tilte = '%java%' : 진짜로 %java% 문자를 찾는다. 

 

ORDER BY

order by 안 쓰면 테이블이 가지고있는 순서에 의해서 뽑아짐 (순서는 보장할 수 없다.)

오늘날짜가 더 큰 값 ( 1970년 1월 1일 기준)

  • desc 내림차순
  • aesc 오름차순 (디폴트)

 

DISTINCT

  • SELECT distinct : 중복되는 것 골라서 하나만 보여줌
  • distinct all : 중복되는 행이 발견해도 다 표현한다.
  • 모든 컴럼이 모두 같을 때, 처리된다. (중복 처리하는 것) 
    • select distinct job, deptno from emp;

 

LIMIT IN

  • LIMIT IN : 위에서 부터 몇 개
  • as : 별칭
    • select now() as 현재시간;
    • select now() as "현재 시간"; : ""씀으로써 공백까지

 

 

'study > JAVA 전문가' 카테고리의 다른 글

mysql 3 - 연습문제  (0) 2021.12.17
mysql 3  (0) 2021.12.17
inner  (0) 2021.12.10
자료구조 2 - 복습  (0) 2021.12.10
자료구조 1  (0) 2021.12.09

public class 

  • 다른 패키지에서도 사용 가능 하게

 

이클립스 단축키 정리하기!

 

inner class

처음부터 가지고 있다. 

Member Inner class

package inner;

class Outter{
	private int num = 0;
	private static int num2 = 3;
	
	class Inner{
		public void disp() {
			System.out.println(num);
			System.out.println(num2);
		}
	}
}
public class MemberInnerTest {
	public static void main(String[] args) {
		Outter o = new Outter();
		Outter.Inner inner = o.new Inner();
		inner.disp();
	}
}

 

		Outter o = new Outter();
		Outter.Inner inner =o.new Inner();
Outter.Inner inner = new Outter().new Inner();

두개는 같은 소스 코드이다. 

static inner clas

package inner;


class Outter{
	private static int num = 0;
	private static int num2 = 3;
	
	static class Inner{
		public void disp() {
			System.out.println(num);
			System.out.println(num2);
		}
	}
}
public class MemberInnerTest {
	public static void main(String[] args) {
		Outter.Inner a = new Outter.Inner();
		a.disp();
	}
}

 

local class

package inner;


class Outter{
	private static int num = 0;
	private static int num2 = 3;
	
	public void Output() {
		class Inner{
			public void disp() {
				System.out.println(num);
				System.out.println(num2);
			}
		}
		Inner in = new Inner();
		in.disp();
	}
}
public class MemberInnerTest {
	public static void main(String[] args) {
		Outter o = new Outter();
		o.Output();
	}
}

 

Anonymous inner class

package inner;
abstract class Abs{
	abstract void disp();	// "disp"
}

class Outter{
	private static int num = 0;
	private static int num2 = 3;
	
	public void output(){
		new Abs() {
			@Override
			void disp() {
				System.out.println(num);
				System.out.println(num2);
			}
		}.disp();
	}
	
}
public class MemberInnerTest {
	public static void main(String[] args) {
		Outter out = new Outter();
		out.output();
	}
}

 

'study > JAVA 전문가' 카테고리의 다른 글

mysql 3  (0) 2021.12.17
DBMS  (0) 2021.12.15
자료구조 2 - 복습  (0) 2021.12.10
자료구조 1  (0) 2021.12.09
Wrapper Class, 제너릭, ,,  (0) 2021.12.08

복습

추상화

  • 내가 물건을 파는 사람이라고 생각
  • 이것을

캡슐화

  • 어떻게 흘러가는지 100% 파악
  • 데이터 손실이 발생했을 때 찾기 쉽다 : DB

상속

  • 물려받는 것
  • 내 것이 아닌데 생기는 것
  • 관계를 명확해야한다.
  • 확장성, 유지보수
  • 설계를 잘 해야한다.
  • 남들이 봤을 때 잘 보이게
  • Class관계
    • Has ~ A관계 (~가 ~를 가지고 있다.) => 임베디드 오브젝트
      • 상식적인 선에서 관계를 맺어야 한다.
    • Is ~ A관계 (~는 ~이다.) => 상속
      • is like관계 X
      • ~는 ~와 같다 X

 

인터페이스

  • 다중상속 대체 
  • 기능 가지고 있지 않다.
    • 강제성 부여
  • 인터페이스만 봐도 '저런 동작을 하구나'를 안다. 
  • 메뉴판과 같다.

 

코드 리뷰

  • 생성자에서 상수 크기, 변수 초기화
    • 잘게 쪼개라
  • protected 
    • private : 오직 메소드를 통해서만 사용 할 수 있다. (getter/setter)
  • abstract : 
    • 행위는 똑같지만, 안에 내용이 다를 때
  • 동적 바인딩
    • 부모가 아는 것만 접근 O
  • final : 꼭 써야 할 때
  • 초기화 null 해야함

 

'study > JAVA 전문가' 카테고리의 다른 글

DBMS  (0) 2021.12.15
inner  (0) 2021.12.10
자료구조 1  (0) 2021.12.09
Wrapper Class, 제너릭, ,,  (0) 2021.12.08
arrays 클래스  (0) 2021.12.08

레퍼런스 타입

  • 오브젝트
    • 메모리에 안 올라옴
  • New
    • 메모리에 올라옴
    • 인스턴스화

 

레퍼런스 변수 

  • 그냥 이름이 홍길동이라면 진짜 사람 홍길동 대상을 접근하는 것

 

배열

  • 동일한 데이터 타입을 순차적으로 확보한 것
  • C언어 :
    • 일반적으로 메모리 할당
    • 1차원 배열로 저장됨 
    • 그냥 표현을 2차원, 다 차원으로 할 뿐
    • <그림>
  • JAVA 
    • int [ ] [ ] arr = new int [2][3];
    • 레퍼런스와 1:1관계
    • <그림>

 

Class 구성원

  • 필드
  • 생성자
    1. 객체 생성
      • 객체 등록 new
    2. 필드 초기화
      • 객체가 생성되는 시점에
      • 쓰레기값 방지
      • java는 디폴트 값 0임
  • 메소드
    • 쓰는 목적
      • 외부와 내부 연결 시켜줌
      • 데이터를 사용 할 수 있게 해줌
      • 캡슐화 메소드를 통해서 함 
    • 인스턴스
      • 각 하나씩 있음
      • new
      • 데이터를 안정적으로 쓰려고
      • 레퍼런스._____
      • this ( O ) 
        • this : 자기자신을 구별하는 키워드
        • 인스턴스 메소드의 첫번째 메소드
        • 무조건 있음 (선언 안 해도)
          • void setXXX ( A this ,,,,)
        • 객체 구별 할 수 있다.
          • 누구의 Set/Get인지
    • static 
      • 미리 만들어진 메모리
      • 공유하는 목적
      • 안 쓰면 안 사라짐
      • 메모리 절약할 수 있음 (공유하면서)
      • 클래스.______
      • this ( X )
        • 객체 구별 X
          • 필드 값 없음
      • 메모리 접근 X
    • final
      • 절대 안 바뀜

 

this 

  • this의 목적
    1. 객체 구별
      1. 지벽변수, 필드 변수
    2. 메소드 내 자신을 리턴
      1. return this 
      2. toString
  • this( )
    • 생성자 호출
    • 내 자신의 오버로딩된 함수에 있는 생성자
    • 내 클래스 내에 오버로딩 된거 부를 때
    • 또 다른 생성자 부름 (필드 초기화)

 

 

접근 제어자 

  • private
  • defalut
  • protected
  • public

 

 

this( )

  • 코드의 가독성이 좋아짐
package pratice;

public class First {
	private int A;
	private int B;
	public First() {
//		A = B = 0;
		this(0,0);
	}
	public First(int a) {
//		this.A = a;
//		B = 0;
		this(a,0);
	}

	public First(int a, int b) {
		this.A = a;
		this.B = b;
	}
	public int getB() {
		return B;
	}

	public int getA() {
		return A;
	}


	public static void main(String[] args) {
		First aa  = new First();
		First bb  = new First(10);
		First cc  = new First(20,3);
		
		System.out.println(aa.getA()+ "\t" + aa.getB());	// 0,0
		System.out.println(bb.getA()+ "\t" + bb.getB());	// 10,0
		System.out.println(cc.getA()+ "\t" + cc.getB());	// 20,3
		
		
	}
}

 

 

static 메소드

  • 인스턴스 필드 값
    • 구별 못 함 -> 구별하지 못 해서 ( this )
    • 메모리 접근하지 못 함 : 인스턴스 객체 만들어지지 못 해서 
  • 구별을 하지 않아도 되는 거 씀 -> static 필드

인스턴스 메소드

 

 

추상 클래스 

  1. 오직 상속을 목적으로 사용
  2. 추상 클래스를 상속 받는 sub class는 무조건 추상 메소드를 오버라이드 해야만 한다. 
    • 하지 않은 경우 추상 클래스화 돼서 객체를 생성할 수 없다. 
  3. 추상 메소드는 강제성을 발휘하기 때문에 꼭 오버라이드를 해야만 한다. 
  4. 추상 클래스 보다 더 추상화 된 것은 interface이다. 
  5. 추상 메소드 , 상수를 갖는게 원칙.
  6. 인터 페이스는 다중 상속을 허용한다. ( 모호성이 발생하지 않는다. )
    • 기능이 없음 -> 클래스에서 정함
  7. 다중 상속을 대체하기 위해 만들어졌다. 
    1. 스레드가 된다. 

 

인터페이스

  • 다중 상속 허용
  • 여러개 쓸 수 있다. 
interface ss{
	//	상수, 추상 메소드
    /*(final static) 생략*/int num = 100;	//	상수

	void disp();	//	추상 메소드
    abstract vodi disp();
}

두가지 경우가 있다.

1.

class second implements ss{

	@Override
	public void disp() {
		// TODO Auto-generated method stub
		
	}
	
}

2.

abstract class second implements ss{
	
}

 

  • 클래스 - 인터페이스 : implement

 

동적 바인딩

  • 부모의 레퍼런스로 자식을 접근하는 방식
  • 서브 클래스가 생겨도 h.disp( )로 접근
  • 접근하기 쉽다. 
  • 코드의 가독성 높임
package Cource;
class Halbe{
	public void disp() {
		System.out.println("halbe");
	}
}
class Abe extends Halbe{
	public void disp() {
		System.out.println("abe");
	}
}
class Me extends Abe{
	public void disp() {
		System.out.println("me");
	}
}
class second{
	public static void main(String [] args) {
		Halbe halbe = new Halbe();
		Abe abe = new Abe();
		Me me = new Me();
		
		Halbe h;
		
		
		h = halbe;
		h.disp();
		
		h = abe;	//	원래 안 되야함. 
		h.disp();
		
		h = me;
		h.disp();
		
		halbe.disp();
		me.disp();
		abe.disp();
		
		
	}
}

 

'study > JAVA 전문가' 카테고리의 다른 글

inner  (0) 2021.12.10
자료구조 2 - 복습  (0) 2021.12.10
Wrapper Class, 제너릭, ,,  (0) 2021.12.08
arrays 클래스  (0) 2021.12.08
얕은 복제, 깊은 복제  (0) 2021.12.07

merge하다가 갑자기 오류생겼음

$ git merge --allow-unrelated-histories copy3/main
error: Merging is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.

알고보니 

이게 달라서였음

git commit -am '커밋 아무거나 메모'

이거 하니깐 뚝딱

 

 

안 되면

clone다시 했다..

'study > Git' 카테고리의 다른 글

레파지토리 여러 개 병합 (합치기)  (0) 2021.12.09
Github Authentication Failed 오류 해결  (0) 2021.10.29
Github 날짜 수정  (0) 2021.10.29

알고리즘 문제 푼다고 레파지토리가 엉망이여서 

하나로 합칠려고 시도했다. 

 

많은 시도가 있었지만 

그냥  git을 이해 못 했나보다 

 

어쨌든 시작해본다. 

 

합쳐서 저장할 레파지토리 만들기

 레파지토리를 새로 만들어준다. 

 

주소를 복사하거나 

저기 나와있는 주소를 복사한다. 

https://github.com/luster1031/Algorithm_Study.git

 

git을 켜준다. 

난 bash가 편해서 사용자에 들어가 git을 열어준다. 

물론 git은 깔려있어야 함

 

github로그인을 최초 설정한다. 

이건 내가 해서 캡쳐본은 없지만, 

이렇게 하면 된다. 

https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EC%B5%9C%EC%B4%88-%EC%84%A4%EC%A0%95

 

Git - Git 최초 설정

Vim과 Emacs, Notepad++은 꽤 인기 있는 편집기로 개발자들이 즐겨 사용한다. Mac이나 Linux 같은 Unix 시스템, Windows 시스템에서 사용 가능하다. 여기서 소개하는 편집기들이 불편해서 다른 편집기를 사

git-scm.com

 

 

새로 만든 레파지토리 (합쳐서 넣을 곳)을 clone해준다

아까 복사한 주소를 넣어준다. 

 

 

원래 레파지토리 (합칠 것)도 clone해준다.

난 이 3개를 다 합칠 것이기 때문에,

3개를 전부 clone 했다. 

git clone https://github.com/luster1031/Algorithm.git
git clone https://github.com/luster1031/Basic.git
git clone https://github.com/luster1031/math.git

 

그럼 사용자에 clone한 레파지토리의 폴더가 생긴다.

 

 

저장한 곳으로 간다. (새로 만든 레파지토리)

cd Algorithm_Study

 

 

저장 할 것을 remote해준다. (복사할 대상)

git remote add copy1 ../Algorithm
git remote add copy2 ../math
git remote add copy3 ../Basic

 

 

fetch, merge해준다. 

아까 copy1, copy2, copy3을 다 해준다. 

여기서 빨간색 부분을 잘 보고 

merge 까지 해준다. 

copy1만 해보고 비워져있었던 저장할 파일 (Algorithm_Study)에 복사된 것을 볼 수 있다.

 

근데 하다보면 

copy2/main이 나오면

오류가 생기는데 

이건

git merge --allow-unrelated-histories [현재 브랜치와 같은 B의 브랜치 이름]

이라고 치면 된다. 

참고는 

https://velog.io/@lina0322/git-git-repository-%ED%95%A9%EC%B9%98%EA%B8%B0git-log-%EC%A7%80%ED%82%A4%EA%B8%B0

 

[git] git repository 합치기(git log 지키기)

안녕하세요. 엘림입니다🙇🏻‍♀️오늘은 repository끼리 merge한 과정을 정리해보았습니다. git fetch와 git merge를 이용하여, 저의 git commit log를 지켜보겠습니다!

velog.io

여기서 했다. 여기가 좋긴해요!~!~

 

그러고나서 딱 문제가

이런 모습이 보인다. 

 

  1. 먼저 i를 누르고
  2. esc누르고
  3. :wq누르고
  4. 엔터

https://velog.io/@ssmin0606/%EA%B0%9C%EB%B0%9C%ED%88%B4-Please-enter-a-commit-message-to-explain-why-this-merge-is-necessary-especially-if-it-merges-an-updated-upstream-into-a-topic-branch-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0-git-bash

 

[개발툴] Please enter a commit message to explain why this merge is necessary, especially if it merges an updated upstream in

Please enter a commit message to explain why this merge is necessary, especially if it merges an updated upstream into a topic branch

velog.io

 

 

 

네 이렇게 3개 다 하고

전 직접 파일을 바꿨어요

복사본은 절대 안 돼요!

옮겨서 했습니다. 그래야 log가 손상 안 돼요!

 

 

변경 상황을 이젠 git에 올려줍니다. 

꼭 Algorithm_Study(변경한 파일 안에서 해주세요!)

소스에 관한 설명은 아래를 참고하였습니다. 

https://coding-factory.tistory.com/244

 

[Git] Git 레파지토리 생성 & 소스 올리기 (Git Bash활용)

GitHub에서 원격저장소를 만든 뒤 Git Bash를 활용하여 Push하는 방법입니다. Git Repository생성 깃허브 바로가기 1. 위에 링크된 깃허브 사이트에가서 로그인을 합니다. (회원이 아니라면 회원가입을 해

coding-factory.tistory.com

 

git init
git status
git add .
git commit -m "algorithm merge files"
git remote add origin https://github.com/luster1031/Algorithm_Study.git
git remote -v
git push -u origin

git push origin master하니까 오류나서 

전 git push -u origin 했습니다. 

 

결과 : 잘 됐습니다!

 

Wrapper Class

  • 박싱 : 기본 데이터를 Wrapper 클래스에 담는거
    • Integer ten = Integer.valueOf(10);
  • 언박싱 : 박싱 반대
package com.javaex.api.array;

public class WrapperEx {
	public static void main(String [] args) {
		Integer i = new Integer(10);	//	deprecated
		Integer i2 = Integer.valueOf(10);
		
		Integer i3 = Integer.valueOf("10");	
		
		//	자동 박싱 
		Integer i4 = 10;	//	Integer i4 = Integer.valueOf(10);
		
		//	자동 언박싱
		int value = i4;		//	int value = i4.intValue();
		
		//	포장된 값 비교
		System.out.println(i == i2);	//	false됨 : Wrapper Class도 객체다. 객체 주소 비교 (주의)
		System.out.println(i.intValue() == i2.intValue());	//	첫번째 방법
		System.out.println(i.equals(i2));	//	두번째 방법
		
	}
}

결과 

false
true
true

 

Generic

 

package com.javaex.api.generic;

public class BoxApp {

	public static void main(String[] args) {
		IntBox iBox = new IntBox();
		iBox.setContent(10);
		System.out.println("IntBox : "+ iBox.getContent());
		
		StrBox sBox = new StrBox();
		sBox.setContent("String");
		System.out.println("StrBox : "+ sBox.getContent());
		
		//	다 들어감 ->
		//	1. 제한이 안 되어 있음
		//	2. 캐스팅 해야함 (런타임오류 발생 가능)
		ObjBox oBox = new ObjBox();
		oBox.setContent(10);
		oBox.setContent("String");
		
		String value = (String)oBox.getContent();
		System.out.println("content : " + value);
		
//		int value1 = (Integer)oBox.getContent(); -> 런타임 오류 발생
		
		
		//	제너릭 사용
		GenericBox<Integer> intGBox = new GenericBox<Integer>();
		//	1. 컴파일러에서 타입 체크 가능
		intGBox.setContent(101);
		//	2. 다운 캐스팅의 불편 해소
		Integer iValue = intGBox.getContent();
		System.out.println("Generic content " + iValue);
		
		
		GenericBox<String> strGBox = new GenericBox<>();
	}

}

GenericBox.java

package com.javaex.api.generic;

public class GenericBox<T>{
	T Content;

	public T getContent() {
		return Content;
	}

	public void setContent(T content) {
		Content = content;
	}
	
}

 

Collection Framwork

인터페이스

  • list
    • 순서 O
    • 중복 허용
  • Set
    • 순서 X
    • 중복 X
  • Map
    • 키와 값의 쌍
    • 순서 유지 X
    • 중복 
      • 키는 중복 X
      • 값은 중복 O

 

배열

  • 빠른 접근
  • 고정된 크기
  • 비효율적 메모리 점유

리스트

  • 가변 크기
  • 느린 접근
  • 참조 자료 유형만 사용 가능

 

Vector

package com.javaex.api.list;

import java.util.Enumeration;
import java.util.Vector;

public class VectorEx {
	public static void main(String[] args) {
		//	백터 선언
		Vector<Integer> v = new Vector<>();
		System.out.println("[아무것도 안 한거] Size : "+ v.size() + ", Capacity : " + v.capacity());
		
		for(int i = 1; i<=10; i++) {
			v.addElement(i);
		}
		System.out.println("[10개 추가] Size : "+ v.size()+ ", Capacity : "+v.capacity());
		
		v.addElement(11);
		System.out.println("[addElement사용] Size : "+ v.size()+ ", Capacity : "+v.capacity());
		
		
		//	삽입
		v.insertElementAt(5, 7);
		System.out.println("[insertElementAt] Size : "+ v.size()+ ", Capacity : "+v.capacity());
		
		//	조회
		System.out.println(v.elementAt(5));
		
		//	검색
		System.out.println("[indexOf(7)] : "+v.indexOf(7));
		System.out.println("[indexOf(12)] : "+v.indexOf(12));
		
		//	포함 여부 확인
		System.out.println("[contains(10)] : "+v.contains(10));
		
		//	삭제
		v.removeElement(5);	//	객체 5를 삭제
		System.out.println("[5삭제 ] : "+ v);
		
		//	순회 -> 이 방법 보단 반복자 사용을 권장
		for(int i = 0; i < v.size(); i++) {
			Integer item = v.elementAt(i);
			System.out.print(item + " ");
		}
		System.out.println();
		
		//	반복자 활용
		Enumeration<Integer> e = v.elements();
		while(e.hasMoreElements()) {	//	값이 있니?
			Integer item = e.nextElement();
			System.out.print(item + " ");
		}
		System.out.println();
		
		
		//	비우기
		v.clear();
		System.out.println("[clear] : "+ v);
	}
}

 

Linked List

  • List는 인터페이스이기 때문에 사용 방법이 같다. 
  • 필드 정의할 때, LinkedList 또는 ArrayList 둘 중 하나로 하면 됨.
package com.javaex.api.list;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class ListEx {
	public static void main(String[] args) {
		//	List는 interface : 사용 방법이 다 같다.
//		List<String> lst = new LinkedList<>();
		List<String> lst = new ArrayList<>();
		
		//	객체 추가
		lst.add("Java");	//	맨 뒤에 새 노드 추가
		lst.add("C");
		lst.add("C++");
		lst.add("Python");
		
		//	객체 삽입
		lst.add(2, "C#");	//	중간에 객체 삽입
		System.out.println(lst);
		
		//	List는 중복삽입 허용
		lst.add("Java");
		System.out.println(lst);
		
		//	List 항목 수 
		System.out.println("Size : " + lst.size());
		
		//	삭제 
		lst.remove(2);
		lst.remove("Java");		//	처음것만 삭제 되나봐 (중복이있어도)
		System.out.println(lst);
		
		//	List, Set의 경우 Iterator 사용
		Iterator<String> it = lst.iterator();
		while(it.hasNext()) {	//	위치를 그 때 그 때 생성해줌
			String item = it.next();	//	다음 요소를 가져온다.
			System.out.print(item + " ");
		}
		
		//	List 비우기
		lst.clear();
		System.out.println(lst);	
	}
}

 

Stack

스택이 비어 있는지 없는지 확인해주면서 pop해야함

package com.javaex.api.list;

import java.util.Stack;

//	Stack : Last input First Output (LIFO : 후입선출)
public class StackEx {
	public static void main(String[] args) {
		//	스택 선언
		Stack<Integer> stack = new Stack<>();
		
		for(int i = 1; i<= 10; i++) {
			//	push
			stack.push(i);
			System.out.println("STACK : " + stack);	
		}
		
		//	가장 위 데이터를 확인 : peek
		System.out.println("PEEK : "+ stack.peek());
		System.out.println("STACK : "+ stack);
		
		//	인출 : pop
		System.out.println("POP : "+stack.pop());
		System.out.println("STACK : "+stack);
		
		while(!stack.isEmpty()) {	//	인출 전에 비어있는지 체크 해줘야 한다.
			System.out.println("POP : "+ stack.pop());
			System.out.println("STACK : "+ stack);
		}
	}
}

 

Queue

  • offer(넣는 것) : 넣기
  • peek( ) : 첫번째 데이터 확인
  • poll( ) : 뽑아 내기
    package com.javaex.api.list;
    
    import java.util.LinkedList;
    import java.util.Queue;
    
    public class QueueEx {
    	public static void main(String[] args) {
    		Queue<Integer> queue = new LinkedList<>();
    		
    		//	First Input First Output(FIFO : 선입선출)
    		for(int i = 0; i <= 10; i++) {
    			queue.offer(i);	//	enqueue
    			System.out.println("QUEUE : " + queue);
    		}
    		
    		//	queue의 첫번째 데이터 확인
    		System.out.println("PEEK : "+ queue.peek());
    		System.out.println("QUEUE : " + queue);
    		
    		//	
    		System.out.println("POLL : " + queue.poll());
    		System.out.println("QUEUE : " + queue);
    		
    		
    		while(!queue.isEmpty()) {
    			System.out.println("POLL : " + queue.poll());
    			System.out.println("QUEUE : " + queue);
    		}
    		
    		
    	}
    }​

 

Hash Set

  • 순서 X
  • 중복허용 X
private static void hashSetCustom() {
		HashSet<Student> hs = new HashSet<>();
		
		Student s1 = new Student("홍길동", 1);
		Student s2 = new Student("홍길동", 2);
		Student s3 = new Student("홍길동", 1);
		
		hs.add(s1); hs.add(s2); hs.add(s3);
		
		System.out.println(hs);
		
		//이름도 같고 아이디도 같은게 들어감
		
		
	}
[Student [id=2, name=홍길동], Student [id=1, name=홍길동], Student [id=1, name=홍길동]]

이름도 같고 id가 같은데 들어간다. 

 

이걸 해결하기 위해

HashCode를 사용함

HshCode

  1. HashCode비교
  2. equals확인
  3. 동등 판별

Student.java

package com.javaex.api.collection.hash;

public class Student {
	int id;
	String name;
	
	public Student(String name, int id) {
		this.name = name;
		this.id = id;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + "]";
	}
	
	//	hashCode 비교 -> equals 확인 -> 동등 판별
	@Override
	public int hashCode() {
		//	 객체 식별값 (정수)
		return id;
	}

	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Student) {
			//	다운캐스팅
			Student other = (Student)obj;
			return name.equals(other.name) && id == other.id;
		}
		return super.equals(obj);
	}
	
	
}

HashSetEx.java

package com.javaex.api.collection.hash;

import java.util.HashSet;

public class HashSetEx {
	//	Hash 알고리즘을 사용하는 컬렉션
	//	HashSet 순서가 없다. 중복을 허용하지 않음
	//	
	public static void main(String[] args) {
		hashSetEx();
		hashSetCustom();
	}
	private static void hashSetCustom() {
		HashSet<Student> hs = new HashSet<>();
		
		Student s1 = new Student("홍길동", 1);
		Student s2 = new Student("홍길동", 2);
		Student s3 = new Student("홍길동", 1);
		
		hs.add(s1); hs.add(s2); hs.add(s3);
		
		System.out.println(hs);
		
		//이름도 같고 아이디도 같은게 들어감
		
		
	}
 }

결과

[Student [id=1, name=홍길동], Student [id=2, name=홍길동]]

 

Hash Table

  • 키 중복 X
  • 키 순서 X
  • 이미 값이 있는 키에 값을 넣으면 덮어쓰기 된다.
    package com.javaex.api.collection.hash;
    
    import java.util.Hashtable;
    import java.util.Iterator;
    import java.util.Map;
    
    public class HashtableEx {
    	public static void main(String[] args) {
    		Map<String, Integer> map = new Hashtable<>();
    		
    		//	키 - 값의 쌍으로 저장
    		//	맵에 데이터 넣기
    		map.put("SOCCER", 11);
    		map.put("BASEBALL", 9);
    		map.put("VOLLEYALL", 6);
    		
    		System.out.println(map);
    		
    		//	키는 HashSet : 키는 중복 될 수 없고 순서가 없다.
    		map.put("VOLLEYALL", 12);
    		System.out.println(map);
    		
    		//	키 포함 여부
    		System.out.println("SOCCER 키가 있는가 ? " + map.containsKey("SOCCER"));
    		
    		//	값 포함 여부 
    		System.out.println("값에 9가 있는가 ? "+ map.containsValue(9));
    		
    		
    		//	Iterator
    		Iterator<String> it = map.keySet().iterator();
    		while(it.hasNext()) {
    			String key = it.next();
    			System.out.printf("[Key] %s => [value] %d%n",
    					key, map.get(key));
    		}
    		
    		//	맵 비우기
    		map.clear();
    		System.out.println(map);
    	}
    	
    }​
    결과
    {SOCCER=11, VOLLEYALL=6, BASEBALL=9}
    {SOCCER=11, VOLLEYALL=12, BASEBALL=9}
    SOCCER 키가 있는가 ? true
    값에 9가 있는가 ? true
    [Key] SOCCER => [value] 11
    [Key] VOLLEYALL => [value] 12
    [Key] BASEBALL => [value] 9
    {}​

 

'study > JAVA 전문가' 카테고리의 다른 글

자료구조 2 - 복습  (0) 2021.12.10
자료구조 1  (0) 2021.12.09
arrays 클래스  (0) 2021.12.08
얕은 복제, 깊은 복제  (0) 2021.12.07
인터페이스  (0) 2021.12.07

복제

package com.javaex.api.array;

import java.util.Arrays;

public class ArrayEx {
	public static void main(String[] args) {
		arrayCopyEx();
	}
	private static void arrayCopyEx() {
		int arr[]  = new int[] {1,2,3,4,5};
		
		//	System 이용 복사
		int[] target = new int[arr.length];
		System.arraycopy(arr,	// 원본배열 
				0,	//	시작인덱스
				target,	//	대상 배열
				0,	//	시작 인덱스
				arr.length	//	복사할 길이
				);
		System.out.println("원본 배열 : " + Arrays.toString(arr));
		System.out.println("System 복제 : "+ Arrays.toString(target));
		
		
		//	arrays의 복제 메서드
		target = Arrays.copyOf(arr, arr.length);	//	원본 배열, 복사할 배열 길이
		System.out.println("CopyOf : "+ Arrays.toString(target));
		
		
		// 	배열 일부 복제
		target = Arrays.copyOfRange(arr, 1, 3);	//	원본 배열, 복사 시작 인덱스, 복사할 끝 인덱스
		System.out.println("CopyOfRange : " + Arrays.toString(target));
	}
}
  • Arrays.arraycopy ( 원본 배열, 시작인덱스, 대상 배열, 대상 배열의 시작 인덱스, 복사할 길이)
  • Arrays.copyOf( 원본 배열, 복사할 배열 길이)
  • Arrays.copyOfRange( 원본 배열, 복사 시작 인덱스, 복사할 끝 인덱스)

 

정렬

1. 

//역순 정렬
	private static void basicSortDesEx() {
		Integer[] scores = {80,50,70,90,75,88,77};
		System.out.println("원본 : "+ Arrays.toString(scores));
		Arrays.sort(scores, Collections.reverseOrder());
		//	배열이 기본 타입이아닌, 랩컨버런스?로 해줘야함 int -> Integer
		System.out.println("역순 정렬 : "+ Arrays.toString(scores));
	}
	private static void basicSortEx() {
		int[] scores = {80,50,70,90,75,88,77};
		System.out.println("원본 : "+ Arrays.toString(scores));
		Arrays.sort(scores);
		System.out.println("Sort정렬 : "+ Arrays.toString(scores));
	}

 

2. 

private static void customClassSort() {
		Member[] members = {
				new Member("홍길동"),
				new Member("고길동"),
				new Member("장길산"),
				new Member("임꺽정")
		};
		System.out.println("원본 : "+ Arrays.toString(members));
		Arrays.sort(members);	//	런타임 에러 ->   cannot be cast to class java.lang.Comparable
		System.out.println("정렬 : "+ Arrays.toString(members));
		Arrays.sort(members, Collections.reverseOrder());;
		System.out.println("역순 정렬 : "+ Arrays.toString(members));
		
	}
package com.javaex.api.array;

public class Member implements Comparable {
	String name;
	
	public Member(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Member [name=" + name + "]";
	}
	
	//	ComparTo를 오버라이딩 해줘야한다. 
	@Override
	public int compareTo(Object o) {
		//	0 : 두 객체의 순번이 같다. 
		//	음수 : 순서가 앞이다. 
		//	양수 : 순서가 뒤다.
		if(o instanceof Member) {
			Member other = (Member)o;
			return name.compareTo(other.name);
		}
		return 0;
	}
	
	
	
}

 

다른 방법으론

private static void customClassSort() {
		Member[] members = {
				new Member("홍길동"),
				new Member("고길동"),
				new Member("장길산"),
				new Member("임꺽정")
		};
		System.out.println("원본 : "+ Arrays.toString(members));
		Arrays.sort(members);	//	런타임 에러 ->   cannot be cast to class java.lang.Comparable
		System.out.println("정렬 : "+ Arrays.toString(members));
		
//		Arrays.sort(members, Collections.reverseOrder());;
		Arrays.sort(members, new Comparator<Member>() {

			@Override
			public int compare(Member o1, Member o2) {
				return o1.name.compareTo(o2.name);
			}
			
			
		});
		System.out.println("역순 정렬 : "+ Arrays.toString(members));
		
	}

Comparetor<Member>를 사용한다. 

검색

이진 검색

  • 미리 정렬이 되어 있어야 한다. 
  • private static void bsicSearch() { int [] scores = {80,50,70,90,75,88,77}; // 이진 검색 방식은 미리 정렬이 되어 있어야 한다. Arrays.sort(scores); System.out.println("원본 : " + Arrays.toString(scores)); int index = Arrays.binarySearch(scores,75); // 75가 몇 번째 인덱스? System.out.println("75가 있는 인덱스 : "+ index); }​

 

 

 

'study > JAVA 전문가' 카테고리의 다른 글

자료구조 1  (0) 2021.12.09
Wrapper Class, 제너릭, ,,  (0) 2021.12.08
얕은 복제, 깊은 복제  (0) 2021.12.07
인터페이스  (0) 2021.12.07
예외  (0) 2021.12.07

+ Recent posts