레퍼런스 타입

  • 오브젝트
    • 메모리에 안 올라옴
  • 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
package com.javaex.api.stringclass;

public class StringEx {

	public static void main(String[] args) {
		usefulMethods();
		
	}
	private static void usefulMethods() {
		//	유용한 메서드들
		String str = "Java Programming JavaScript Programming";
		
		System.out.println("str : "+ str);
		System.out.println("LENGTH : " + str.length());
		
		//변환 메서드
		System.out.println("UPPER : " + str.toUpperCase());
		System.out.println("LOWER : " + str.toLowerCase());
		
		
		//	검색 메서드
		System.out.println("인덱스 5의 글자 : "+ str.charAt(5));
		int index = str.indexOf("Java");	// 	JAVA의 인덱스
		System.out.println("1번 Java 인덱스 : "+ index);
		index = str.indexOf("Java",5);	//	5번 인덱스 이후의 Java
		System.out.println("2번 Java 인덱스 : "+ index);
		index = str.indexOf("Java", 21);	//	21번 인덱스 이후의 Java
		System.out.println("3번째 Java 인덱스 " + index);	//	찾을 수 없는 것 : -1
		
		System.out.println("마지막 Java 인덱서 : " + str.lastIndexOf("Java"));	//	가장 마지막 인덱스
		
		//	문자열 추출
		//	5번부터 끝까지 추출
		System.out.println("substring(5) : "+ str.substring(5));
		System.out.println("substring(5, 16) : "+ str.substring(5, 16));	// 5 ~ 16앞까지
		
		//	문자열 변경
		System.out.println("replace : " + str.replace("Programming","Coding"));
		
		//	문자열은 변경 되지 않음
		System.out.println("str : "+ str);
		
		//	화이트 스페이스 제거
		String s2 = "                       Hello                    ";
		String s3 = "                Java                         ";
		
		System.out.println(s2.trim() + " " + s3.trim());
		
		
		//	문자열 분리
		String[] words = str.split(" ");
		for (String word : words) {
			System.out.println("WORD : " + word);
		}
		
		//	문자열 비교 ; Unicode 비교
		//	0 : 순서가 같다
		//	음수 : 순서가 빠르다.
		//	양수 : 순서가 늦다.
		System.out.println("BCD".compareTo("ABC"));	
	}

}

 

compareTo : 문자열 비교해서 누가 먼저인지

  • sortting할 때 중요

 

package com.javaex.api.stringclass;

import com.javaex.basic.StirngEx;

public class StringEx {

	public static void main(String[] args) {
		usefulMethods();
		stringBuffer();
		
	}
	private static void stringBuffer() {
		//	버펴의 생성
		StringBuffer sb = new StringBuffer("This");
		System.out.println(sb);
		//	문자열 추가 : append
		sb.append(" is pencil");
		System.out.println(sb);
		
		//	문자열 삽입 : insert
		sb.insert(7,  " my");
		System.out.println(sb);
		
		//	문자열 치환 : replace
		sb.replace(7, 10, " your");
		System.out.println(sb);
		
		//	버퍼 사이즈 조정 : setLength
		sb.setLength(5);
		System.out.println(sb);
		
		
		StringBuffer sb2 = new StringBuffer("This").append(" is pencil").insert(7," my").replace(7, 10, " your");
		String s = sb2.toString();
		System.out.println(s);
		
	}
 }
  • stringBuilder : Not thread safe (동기화 필요 없을 때 좋음)
  • StringBuffer : thread safe ( 멀티스레드 환경에서)

Object 클래스 toSting() 오버라이드

Point.java

package com.javaex.api.objectclass.v1;

//	자바 최상위 클래스는 Object
public class Point {
	private int x;
	private int y;
	
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	@Override
	public String toString() {
		//	객체 문자열 포맷을 반환
		return String.format("Point(%d, %d)",x,y);
	}
}

LangClassTest.java

package com.javaex.api.objectclass.v1;

public class LangClassTest {

	public static void main(String[] args) {
		Point p = new Point(10,10);
		
		//Object의 메서드를 기본 상속
		System.out.println(p.getClass().getName());	//	클래스 정보 : com.javaex.api.objectclass.v1.Point
		System.out.println(p.hashCode());	//	객체 식별자 : 1521118594
		System.out.println(Integer.toHexString(p.hashCode()));	//	5aaa6d82
		
		System.out.println(p);	//	클래스명@해시코드 16진수 값 : com.javaex.api.objectclass.v1.Point@5aaa6d82
		System.out.println(p.toString());
		
	}

}

결과 

com.javaex.api.objectclass.v1.Point
1521118594
5aaa6d82
Point(10, 10)
Point(10, 10)

 

 

equals( )

package com.javaex.api.objectclass.v2;

public class LangClassTest {

	public static void main(String[] args) {
		Point p1 = new Point(10,10);
		Point p2 = new Point(10,10);
		
		System.out.println("p1 == p2 ? " + (p1 == p2));
		System.out.println("p1.equals(p2) ? " + p1.equals(p2));
	}

}

결과

p1 == p2 ? false
p1.equals(p2) ? false

 

equals 오버라이딩

Point.java

package com.javaex.api.objectclass.v2;

//	자바 최상위 클래스는 Object
public class Point {
	private int x;
	private int y;
	
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	@Override
	public String toString() {
		//	객체 문자열 포맷을 반환
		return String.format("Point(%d, %d)",x,y);
	}

	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Point) {
			Point other = (Point)obj;	//	변환
			return x == other.x && y == other.y;
		}
		return super.equals(obj);
	}
	
	
}

결과 

p1 == p2 ? false
p1.equals(p2) ? true

 

 

객체 단순 복제

LangClassTest.java

package com.javaex.api.objectclass.v3;

public class LangClassTest {

	public static void main(String[] args) {
		Point p1 = new Point(10,10);
		
		System.out.println("p1 =" + p1);
		
		Point p2 = p1.getClone();	//	복제
		System.out.println("p2 =" + p2);
		
		System.out.println("p1 == p2 ? "+ (p1 == p2));
		
		p1.setX(100);
		p1.setY(200);
		System.out.println("p1 =" + p1);
		System.out.println("p2 =" + p2);
		
	}

}

Point.java

package com.javaex.api.objectclass.v3;

//	v3. 얕은 ㅗㅂ갓

// 	객체 필드데이터를 단순 복제
//	Cloneable 인터ㅔ이스 구현
public class Point implements Cloneable{
	public Point getClone() {
	//복제본
	Point clone = null;
	try {
		clone = (Point) clone();
	}catch(CloneNotSupportedException e) {
		e.printStackTrace();
	}
	return clone;
	}
	
	
	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	private int x;
	private int y;
	
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	@Override
	public String toString() {
		//	객체 문자열 포맷을 반환
		return String.format("Point(%d, %d)",x,y);
	}

	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Point) {
			Point other = (Point)obj;	//	변환
			return x == other.x && y == other.y;
		}
		return super.equals(obj);
	}
	
	
}

 

결과 : 

p1 =Point(10, 10)
p2 =Point(10, 10)
p1 == p2 ? false
p1 =Point(100, 200)
p2 =Point(10, 10)

객체 필드 데이터 단순 복제

 

깊은 복제

LangClassTest.java

package com.javaex.api.objectclass.v4;

public class LangClassTest {

	public static void main(String[] args) {
		ScoreBoard s1 = new ScoreBoard(new int[] { 10,20,30,40});
		System.out.println("s1 = " + s1);
		
		ScoreBoard s2 = s1.getClone();
		System.out.println("s2 = " + s2);
		
		System.out.println("s1 == s2 ? "+ (s1 == s2));
		
		s2.getScores()[2] = 100;
		System.out.println("s1 = " + s1);
		System.out.println("s2 = " + s2);
		System.out.println("s1.scores == s2.scores ? "+ (s1.getScores() == s2.getScores()));
	}

}

ScoreBoard.java

package com.javaex.api.objectclass.v4;

import java.util.Arrays;

//	v4. 깊은 복제
public class ScoreBoard implements Cloneable{
	//참조 타입 필드
	private int[] scores;
	
	//	생성자
	public ScoreBoard(int[] scores) {
		this.scores = scores;
	}
	
	public ScoreBoard getClone() {
		ScoreBoard clone = null;
		try {
			clone = (ScoreBoard)clone();
		}catch(CloneNotSupportedException e) {
			e.printStackTrace();
		}
		
		return clone;
	}

	public int[] getScores() {
		return scores;
	}

	public void setScores(int[] scores) {
		this.scores = scores;
	}

	@Override
	public String toString() {
		return "ScoreBoard [scores=" + Arrays.toString(scores) + "]";
	}
	
	
}

결과 

s1 = ScoreBoard [scores=[10, 20, 30, 40]]
s2 = ScoreBoard [scores=[10, 20, 30, 40]]
s1 == s2 ? false
s1 = ScoreBoard [scores=[10, 20, 100, 40]]
s2 = ScoreBoard [scores=[10, 20, 100, 40]]
s1.scores == s2.scores ? true

객체를 만드는 것

 

깊은 복제를 얕은 복제 시도

LangClassTest.java

package com.javaex.api.objectclass.v4;

public class LangClassTest {

	public static void main(String[] args) {
		ScoreBoard s1 = new ScoreBoard(new int[] { 10,20,30,40});
		System.out.println("s1 = " + s1);
		
		ScoreBoard s2 = s1.getClone();
		System.out.println("s2 = " + s2);
		
		System.out.println("s1 == s2 ? "+ (s1 == s2));
		
		s2.getScores()[2] = 100;
		System.out.println("s1 = " + s1);
		System.out.println("s2 = " + s2);
		System.out.println("s1.scores == s2.scores ? "+ (s1.getScores() == s2.getScores()));

	}

}

ScoreBoard.java

package com.javaex.api.objectclass.v4;

import java.util.Arrays;

//	v4. 깊은 복제
public class ScoreBoard implements Cloneable{
	//참조 타입 필드
	private int[] scores;
	
	//	생성자
	public ScoreBoard(int[] scores) {
		this.scores = scores;
	}
	
	public ScoreBoard getClone() {
		ScoreBoard clone = null;
		try {
			clone = (ScoreBoard)clone();
		}catch(CloneNotSupportedException e) {
			e.printStackTrace();
		}
		
		return clone;
	}

	public int[] getScores() {
		return scores;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		//	1. 얕은 복제 시도
		ScoreBoard clone = (ScoreBoard)super.clone();
		//	2. 내부 참조 객체를 복제
		clone.scores = Arrays.copyOf(scores, scores.length);
		return clone;
	}

	public void setScores(int[] scores) {
		this.scores = scores;
	}

	@Override
	public String toString() {
		return "ScoreBoard [scores=" + Arrays.toString(scores) + "]";
	}
	
	
}

결과

s1 = ScoreBoard [scores=[10, 20, 30, 40]]
s2 = ScoreBoard [scores=[10, 20, 30, 40]]
s1 == s2 ? false
s1 = ScoreBoard [scores=[10, 20, 30, 40]]
s2 = ScoreBoard [scores=[10, 20, 100, 40]]
s1.scores == s2.scores ? false

참조 타입 필드를 같이 참조하다가.

1. 얕은 복제하고

2. 내부 참조 객체를 복사해왔다.

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

Wrapper Class, 제너릭, ,,  (0) 2021.12.08
arrays 클래스  (0) 2021.12.08
인터페이스  (0) 2021.12.07
예외  (0) 2021.12.07
추상 클래스  (0) 2021.12.07

인터페이스

  • 서로 관계가 없는 물체들이 상호작용 하기 위해
  • 실제 클래스만 상관없이 규약만 맞으면 어디든 저장 상관 X
  • 하나 또는 그 이상 클래스들에서 똑같이구현되어질 법한 메서드 선언할 때
  • 개발 코드를 수정하지 않고, 가용하는 객체를 변경할 수 있도록
  • 부모클래스로 자식 객체 참조 O
  • 인터페이스로 구현한 객체를 참조할 수 있다.
  • 선언 : interfce "인터페이스명"
    • abstract 키워드 지정 안해도 됨 -> 추상메소드만 들어가기 때문
  • 다중 implements할 수 있음

 

추상클래스 인터페이스
- 상속관계
- "확장"
상속관계를 해치지 않음 (상속관계 상관 X)
그냥 비슷한 규약(함수) 적용

 

변수명

  • 윈도 C++ -> "I인터페이스명"
  • java -> "___able"

 

실습

ShapeApp.java

package com.javaex.oop.shape.v2;

public class ShapeApp {

	public static void main(String[] args) {
//		shape  s = shape();	//	에러 -> 추상 클래스는 객체화 할 수 없다.
		Rectangle r = new Rectangle(10, 20, 100, 50);
		r.draw();
		
		Circle c = new Circle(10, 10, 30);
		c.draw();
		
		Point p = new Point(100,100);
		
		
		System.out.println("p는 Drawable을 구현했는가?\n" + (p instanceof Drawable ? "Drawalbe 구현 O":"Drawalbe 구현 X"));
	}
}

Drawable.java (인터페이스)

package com.javaex.oop.shape.v2;

//	내부에 추상 메서드만 가진다 (	abstract 생략)
public interface Drawable {
	public void draw();
}

Rectangle.java

package com.javaex.oop.shape.v2;


public class Rectangle extends Shape implements Drawable{
	//	필드
	protected int width;
	protected int height;
	
	public Rectangle(int x, int y, int width, int height) {
		super(x,y);
		this.width = width;
		this.height = height;
	}
	
	
	//	모두 구현해줘야 한다. 
	//	source -> override/.. 클릭
	@Override
	public void draw() {
		System.out.printf("사각형[x = %d, y = %d, w = %d, h = %d, area = %f]\n",x,y,width, height,area());
	}

	@Override
	public double area() {
		return width * height;
	}	
}

Circle.java

package com.javaex.oop.shape.v2;

public class Circle extends Shape implements Drawable{
	protected double r;
	
	public Circle(int x, int y, int r) {
		super(x, y);
		this.r = r;
	}

	
	@Override
	public void draw() {
		System.out.printf("원[x=%d, y=%d, r=%f, area = %f]을 그렸어요\n", x,y,r,area());
	}

	@Override
	public double area() {
		return Math.PI * Math.pow(r, 2);
	}

}

Point.java

package com.javaex.oop.shape.v2;

public class Point implements Drawable {

	protected int x;
	protected int y;
	
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
	@Override
	public void draw() {
		System.out.printf("점[x=%d, y=%d]을 그렸습니다.\n",x,y);
	}
	

}

shape.java

package com.javaex.oop.shape.v2;

//	추상 클래스
public abstract class Shape {
	protected int x;
	protected int y;
	
	public Shape(int x, int y) {
		this.x = x;
		this.y = y;
	}
	
	//	추상 클래스는 내부에 반드시 하나 이상의 추상메소드가 있어야 
//	public abstract void draw();	//	인터페이스에 위임
	public abstract double area();
}

결과

사각형[x = 10, y = 20, w = 100, h = 50, area = 5000.000000]
원[x=10, y=10, r=30.000000, area = 2827.433388]을 그렸어요
p는 Drawable을 구현했는가?
Drawalbe 구현 O

 

 

  • 공통점만 뽑아서 관리하면 상속관계에 상관없이 관리 가능

ShapeApp.java

package com.javaex.oop.shape.v2;

public class ShapeApp {

	public static void main(String[] args) {
//		shape  s = shape();	//	에러 -> 추상 클래스는 객체화 할 수 없다.
		Rectangle r = new Rectangle(10, 20, 100, 50);
		r.draw();
		
		Circle c = new Circle(10, 10, 30);
		c.draw();
		
		Point p = new Point(100,100);
		
		
		System.out.println("p는 Drawable을 구현했는가?\n" + (p instanceof Drawable ? "Drawalbe 구현 O":"Drawalbe 구현 X"));
		
		//	인터페이스로 구현 객체를 참조할 수 있다.
		Drawable[] objs = new Drawable[] {
				r,c,p
		};
		for(Drawable obj : objs) {
			obj.draw();
		}
	}
}

 

 

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

arrays 클래스  (0) 2021.12.08
얕은 복제, 깊은 복제  (0) 2021.12.07
예외  (0) 2021.12.07
추상 클래스  (0) 2021.12.07
[모의 필기테스트] 오답노트 & 정리  (0) 2021.12.07

+ Recent posts