자바 기초 프로그래밍 5일차

awarduuu·2023년 3월 8일
0

230308

복습

toString 오버라이딩

객체의 toString()을 오버라이딩하면 객체만 출력하는 메소드를 재정의할 수 있다.

class A {
	private int i = "안녕?"
    
    public A() {}
    
    public String toString(){
    	return i;
    }
    
    public static void main(String[] args) {
    	A a = new A();
   		System.out.println( a ); // 출력결과 : "안녕?"
    }

}

1. StringBuilder, StringBuffer

String은 상수이다!! -> 값변경이 불가

따라서, StringBuilder, StringBuffer를 이용하여 String을 handle한다.

StringBuilder

  • 비동기화 처리
  • 싱글 쓰레드 환경에서 쓰기 때문에, 대부분의 어플리케이션 환경에서 자주 사용한다.

StringBuffer

  • 동기화 처리
  • 멀티 쓰레드 환경에서 쓰기 때문에, 자주 사용되지 않는다.

// String을 계속 더해주면, 가비지 콜렉션이 계속 발생한다.
String str = "A"
str += "B";

// StringBuilder를 사용하여 가비지 콜렉션이 계속 발생하는 단점을 없앤다.
StringBuilder builder = new StringBuilder();
builder.append("A");
builder.append("B");

StringBuilder, StringBuffer 쉽게 이용하는 방법

  1. source 이동
  2. Generate toString() 이동
  3. Codestyle을 StringBuilder/StringBuffer로 변경

2. equals 메소드

① equals method는 Object class에서 정의되어 String등의 여러 class에서 Overloading(재정의)되어 있다.

② primitiveType은 ==으로 비교하면 값을 비교한다.

③ ObjerctType은 ==으로 비교하면 주소값을 비교한다.

④ Objerct class의 equals는 ==과 같은 역할을 한다. (주소값 비교)

String class의 equals는 ==과 다른 역할을 한다. (값 비교)


3. 기타제한자

final

  • 변수
    • 변수 앞에 final이 오면 상수가 된다.
    • 값 변경 불가, 상수는 모두 대문자로 표현
    • 반드시 초기화해야 한다. (전역 변수도 마찬가지)
    • 지역변수에도 올 수 있다.
package day05;

public class FinalKeywordExam {
	// final 필드
	final int i; // 반드시 초기화 필수, 생성자에서 초기화 가능
    // 상수 필드
	static final int J = 10; // 반드시 초기화 필수, 생성자에서 초기화 불가능
	int k; 
	
	public FinalKeywordExam() {
		i = 50; // final 필드를 생성자를 이용해서 초기화 할 수 있다.
	}
    public FinalKeywordExam(int value) {
		i = value; // final 필드를 생성자를 이용해서 초기화 할 수 있다.
	}
    
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}
  • 메소드
    - 메소드 앞에 오면 overriding(재정의) 불가

  • 클래스
    - 클래스 앞에 오면 상속 불가 (객체 생성은 가능)

abstract

  • 변수

    • 변수 앞에 올 수 없다
  • 메소드

    • 메소드 앞에 오면 선언부만 있고 구현부 없다 (기능이 없다)
      => 서브 클래스에서 재정의 하기 위해 존재!!!
    • abstract method를 가지고 있는 class는 반드시 abstract class로 선언해야 한다.
  • 클래스

    • abstrac class는 생성할 수 없다 (new 사용 안됨)
    • 다른 class의 부모(Super)가 되기 위해 존재한다 (목적)
    • 상속관계에 있을 때 superclass가 abstract method를 가지고 있으면 서브class에서
      abstract method를 재정의 해야 한다
      => 만약, 재정의 하지 않으면 서브class는 abstract으로 선언되어야 하며 객체생성 불가
package day05;

public class AbstractKeywordExam {
	public static void main(String[] args) {
		Remote re = new LgRemote();
		re.on();
		
		re = new SamsungRemote();
		re.on();
		
	}
}

abstract class Remote{
	abstract void on();
}

class LgRemote extends Remote{
	void on() {
		System.out.println("LgRemote on");
	};
}

class SamsungRemote extends Remote{
	void on() {
		System.out.println("Samsung on");
	};
}

4. Interface

① class와 유사하지만 class가 아니다 ⇨ 상속X, 생성X

ex) interface A{ }

② interface를 구현(implements)하여 다중상속 같은 효과 얻음

interface의 모든 변수는 public static final이다 (상수- 변하지 않는다)

interface의 모든 method는 public abstract이다 ⇨ 기능X

⑤ 위의 ③,④번으로 선언되어 있지 않더라도 무조건 interface 안의 변수는 상수, method는 abstract method이다

⑥ interface는 생성 할 수 없지만 Type(자료형)으로 사용가능

⑦ interface는 다른 interface를 상속 받을 수 있으나 class는 상속 받을 수 없다

⑧ class가 interface를 implements하게 되면 interface에 있는 모든 method 재정의해야 한다. 안 하면 abstract class로 선언되어야 한다

⑨ 만약, interface가 interface를 상속 받았고, 서브 interface를 class가 implements 하면 서브, 슈퍼 interface에 있는 모든 method class안에서 재정의 해야 한다

package day05;

interface A {
	// 필드 public static final
	int i = 0; // 반드시 초기화 필수
	
	// 메소드 public abstract
	void aa(); // {body}가 없어야 함
	abstract void bb();
}

interface B {
	int cc();
	String dd(int i);
}

class C {
	public void test() {};
}

class Test extends C implements A, B { // Test is a A, B, C 성립

	// A의 abstract void Override
	@Override
	public void aa() {
		
	}

	@Override
	public void bb() {
		
	}
	
	// B의 abstract void Override
	@Override
	public int cc() {
		return 0;
	}

	@Override
	public String dd(int i) {
		return null;
	}
	
}

public class InterfaceExam {

	public static void main(String[] args) {
//		A a = new A(); 인터페이스는 생성 불가
 		// 다형성
		A a = new Test();
		B b = new Test();
		C c = new Test();
	}

}

5. Collection

자료구조

데이터를 저장하는 구조

  • import java.util.* ; 에서 제공한다
  • Collection Framework이라고 한다
  • 데이터를 저장하는 방식에 따라 이미 필요한 객체나 interface를 만들어서 풍부하게 제공을 한다. 사용자인 우리는 만들어 놓은 객체 또는 interface 를 가져다 사용하면 데이터조작을 손쉽게 할수 있다.(ex) 등록, 수정, 삭제, 검색......)
  • 제공된 메소드를 최대한 이용하여 작성하면 코딩은 간결하고 하는일 더 많이 할수 있다
  • 객체만 저장가능하고 다양한 데이터타입 저장가능하다
  • 자료구조 공간의 크기가 늘어난다

제공되는 인터페이스

1) List : 순서(index) 있고 중복이 가능하다.

구현객체 - ArrayList, Vector, LinkedList,....  

2) Set : 순서가 없다, 중복안됨.

구현객체 - HashSet, TreeSet : element를 정렬해준다!!

3) Map : key와 value의 한쌍으로 이루어지며, key는 중복안되고 value는 중복가능하다

구현객체 - HashMap, Hashtable, TreeMap, Properties...

List 관련 메소드

1) 추가

~.add(Object obj);

2) 가져오기

Object obj = ~.get(int index);

3) 저장된 객체의 개수

int size = ~.size();

4) 제거

remove(int index); // index는 0부터 시작
remove(Object obj);

Collection 사용 - 상속을 활용한 방법

package day05;

import java.util.ArrayList;

public class ListExam extends ArrayList<Integer> {
	public ListExam() {
		super(6);
		// 추가
		super.add(3);
		this.add(5);
		add(1);
		super.add(7);
		
		// 출력
		System.out.println("저장된 개수 : " + super.size()); // 저장된 개수 : 4
		
		for(int i=0; i<super.size(); i++) {
			// 저장된 데이터 조회
			int num = super.get(i);
			System.out.print(num + " ,"); // 3 ,5 ,1 ,7 ,
		}
		
		// 제거
		super.remove(2); // index가 2번지, 즉 3번째 객체를 제거
		
		System.out.println("\n제거 후 저장된 개수 : " + super.size()); // 제거 후 저장된 개수 : 3
		
		// Collection은 Object의 toString을 Overriding해서 주소값이 아닌 내용물이 출력한다.
		System.out.println(this); // [3,5,7]
	}
	
	public static void main(String[] args) {
		new ListExam();
	}
}

Collection 사용 - 생성을 활용한 방법

package day05;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ListExam2{
	List<Integer> list = new ArrayList<Integer>(6);
	
	public ListExam2() {
		// 추가
		list.add(3);
		list.add(5);
		list.add(1);
		list.add(7);
		list.add(1);
		list.add(2);
		
		// 출력
		System.out.println("저장된 개수 : " + list.size()); // 저장된 개수 : 4
		
		for(int i=0; i<list.size(); i++) {
			// 저장된 데이터 조회
			int num = list.get(i);
			System.out.print(num + " ,"); // 3 ,5 ,1 ,7 ,
		}
		
		// 제거
		list.remove(2); // index가 2번지, 즉 3번째 객체를 제거
		
		System.out.println("\n제거 후 저장된 개수 : " + list.size()); // 제거 후 저장된 개수 : 3
		
		System.out.println(list); // 주소
		
		// 정렬
		Collections.sort(list);
		Collections.sort(list, null);
		
		System.out.println("정렬 후 : " + list); // 오름차순 정렬
	}
	
	public static void main(String[] args) {
		new ListExam2();
	}
}

WapperClass

기본형을 객체로 변환해주는 전용클래스

  • Collection의 generic type에 들어가려면 객체여야 하므로 기본형을 객체로 변환해주는 WapperClass를 넣는다.

  • 자바에서는 기본형과 WapperClass 사이에서 AutoBoxing, Unboxing이 일어난다.

	Integer i = 5; // AutoBoxing
    int j = new Integer(4); // Unboxing

6. Comparable VS Comparator

  • Comparable과 Comparator는 모두 인터페이스(interface)
  • Comparable 혹은 Comparator을 사용할때 인터페이스 내에 선언된 메소드를 반드시 재정의 필수. 객체를 비교할 때 사용한다.
  • Comparable은 자기 자신과 매개변수 객체를 비교함
  • Comparator는 두 매개변수 객체를 비교 함.
  • Comparable은 lang패키지에 있기 때문에 import 를 해줄 필요가 없지만, Comparator는 util패키지에 있기때문에 반드시 import 필수

Comparable

Interface Comparable<T>
   : int compareTo(T o)
   
   Parameters(인수):
       o - 비교할 대상.
   Returns:
      음수이면 인수가 크다.
      0이면 같다.
      양수이면 자신이 크다.
      쉽게 말해 (자신 - 인수)가 결과

Comparator

Interface Comparator<T>
   : 메소드가 많지만 대부분 static, default
   :  int compare(T o1,  T o2)

   Parameters:
   o1 - the first object to be compared.
   o2 - the second object to be compared.

   Returns: 
   		o1 - o2 => 오름차순
        o2 - o1 => 내림차순
profile
선한 영향력을 만드는 개발자

0개의 댓글