11월 3일 Day 17

여우·2022년 11월 6일
0

공부중

목록 보기
11/38

Object 클래스

  • 자바의 모든 객체는 Object라는 클래스의 인스턴스이다.
  • Object는 자바에 있는 모든 클래스의 최상위 슈퍼 클래스이다.
  • Object 클래스에 정의된 메서드는 모든 클래스가 오버라이딩 할 수 있다(단,final은 제외)

예시)

B클래스 객체를 A클래스 형태로 참조하는 변수를 만들고 이를 다시 강제로 다운캐스팅해서 참조해서 바라보는 ob2를 만들어도. getClass를 통해서 얻는건 자신들이 만들어진 B클래스들이다. 이 객체를 다시 슈퍼클래스인 Object 식으로 참조하도록 하여도 getClass에서는 B클래스가 출력이 된다. 이로써 업캐스팅이 되어도 자신들의 정보가 변하지 않는다는걸 알 수가 있다.

다음은 MyNumber라는 클래스를 이용하여 객체를 생성하는데 그 객체들을 비교하고있다.


MyNumber 클래스는 int를 하나 전달받아서 객체를 생성할수 있고, 슈퍼클래스의 메서드중 toString 과 equals를 오버라이딩하여 사용하고 있다. 원래의 equals는 객체끼리 비교하여 참거짓을 반환하는 메서드 였지만 오버라이딩 하여 this의 num 과 비교대상의 num을 비교하여 반환한다.

객체는 각자 생성될때 자신의 필드에서 생성이 되므로 그 안의 값이 같을지라도 같다고 할 수 없다.

Collection Framework

  • Collection Framework : 다수의 데이터를 관리하기 위해 자료를 저장할 수 있는 구조
  • 이 구조를 여러 클래스로 만들어두고, 편의를 위한 메서드도 준비되어 있다
  • 어떤 종류의 컬렉션이 있는지, 어떻게 사용하는 것인지 익히고, 적재적소에 활용할 수 있도록 연습하자
  • List : index로 값에 접근하고, 중복을 허용한다
  • Set : index 개념이 없고, 중복을 허용하지 않는다
  • Map : index 대신 key라는 형식을 이용하여 값(value)에 접근한다.
    이때, key는 중복을 허용하지 않고, value는 중복을 허용한다

< ArrayList >
ArrayList는 List 인터페이스를 상속받은 클래스로 크기가 가변적으로 변하는 선형리스트입니다. 일반적인 배열과 같은 순차리스트이며 인덱스로 내부의 객체를 관리한다는점등이 유사하지만 한번 생성되면 크기가 변하지 않는 배열과는 달리 ArrayList는 객체들이 추가되어 저장 용량(capacity)을 초과한다면 자동으로 부족한 크기만큼 저장 용량(capacity)이 늘어난다는 특징을 가지고 있습니다.

ArrayList list = new ArrayList();

ArrayList 타입의 객체를 생성하여 .add를 통하여 리스트에 데이터를 추가 할 수 있다.

중복된 데이터도 추가가 가능하고, 자료형이 달라도 추가가 가능하다.
또한 리스트의 크기가 고정적이지 않고 데이터가 추가 될때마다 길이가 자동으로 변한다.
리스트의 길이는 list.size로 확인이 가능하다.

그리고 toString이 오버라이딩이 되어 있어 출력문에 list 만 작성하여도 출력이 가능하다.

.get(index)를 이용하여 리스트의 값을 가져 오는것도 가능하다. 가져온 값을 다시 변수에 저장하여 사용도 가능하다.

ArrayList 안의 데이터 출력

먼저 객체 생성을 위한 클래스를 부분을 먼저 완성해준다.
또한 객체를 출력할 toString 부분은 오버라이딩 하여주고.
void형 메서드로 요소들을 출력하는 메서드도 만들어준다.

그리고

메인문아래에 ArrayList 형식의 객체를 생성하여 생성한 객체 list1에 데이터들을 추가해준다. 정수 뿐아니라, 실수도 추가하고 Human 타입의 객체까지 추가 하여 주고 list1을 통째로 출력시켜주면


정수 실수 뿐만아니라 객체의 정보까지 나오게 된다. 이는 toString이 오버라이딩 되어서 이렇게 출력이 가능하다.

리스트에는 이렇듯 서로 다른 자료형이 들어 올 수 있다.
하지만 만약 내부 원소가 Object 타입이라면, 객체의 메서드를 호출하기 위해 일일이 다운캐스팅을 하는 번거로움이 생기게 된다. 그리하여 자바1.5 부터는 새로 추가된 제너릭 타입 문법을 적용하여 문제를 해결하였다.

이는 특정 클래스의 객체만 저장하는 리스트를 말한다.

ArrayList< Human > 이라고 이렇게 옆에 들어간 객체 자료형을 지정해준다.
마찬가지로 .add로 추가 하고 값을 불러오는 .get(index)로 사용이 가능하다.

for문의 경우 이전까지 사용해왔던 방식으로도 가능하고
향상된 for문 그리고 ForEach를 통해서도 가능하다.

향상된 for문은 for(자료형 변수명 : 배열명) 으로 사용하며 종속문 아래에 미리 정의해둔 .show() 함수를 이용해서 출력 할 수 있다.

list에는 forEach문이 존재하는데 사용법은(내부 원소들을 지칭할 이름 -> 원소명.메서드()); 이런식으로 사용이 가능하다.

그리고 toString()이 오버라이딩이 되어 있다면 forEach문에 매개변수로(System.out::println) 으로도 출력이 가능하다.

System.이 표준 입출력 클래스이고, 이 System의 out으로 println() 함수가 호출되고 괄호 안의 매개변수는 list3의 요소들이 들어가게 된다. 그러면 결국
System.out.println(list3.element)를 ForEach가 끝날때 까지 사용된다.

comparable 과 comparator

Comparator 는 매개 변수 두개를 받아서 비교하는 인터페이스이다. 이 인터페이스는 오로지 하나의 메서드만 존재하며, Comparator를 구현하면 이 메서드를 무조건 오버라이딩해야 한다. 이렇듯 단 하나의 메서드만 가지며 이를 를 사용하는 인터페이스들을 함수형 인터페이스라고 한다.

사용법은 Comparator를 구현한 클래스를 객체화 하여 사용한다.

예시)

Item 이라는 클래스를 만들어두고, 메인에서 Arraylist로 Item들을 하나씩 넣어준다.

현재 List1은 int 타입들을 Integer 래퍼 클래스 타입으로 객체화 하여 저장하였고, 이 기본 자료형들은 Arraylist의 sort()함수로 자동 오름정렬로 정렬이 가능하다.
결과 )

하지만, list2는 Item이라는 클래스들의 객체들로 여러정보들을 가지며 무엇을 기준으로 정렬할것인지 아무런 기준이 없는 상태이다. 이럴때 Comparator를 사용할 수 있다.

방법1) 클래스를 아예 선언하여 객체로 직접 만들어 사용하기.

먼저 클래스로 선언해준다. 두개의 전달인자를 받도록 설정하였다. sort()의 경우 기본적으로 오름차순 정렬이기에 전자 - 후자 하였을때 결과같이 음수 이면 그대로 양수로 나온다면 전자가 후자로 이동하는 식이다. 그래서 전자의 가격 - 후자의 가격 으로 오름차순 정렬이 가능하다.

클래스로 선언해둔 Mycomparator 를 객체화 하여 priceCmp의 이름으로 저장하여서 sort( )에 매개변수 전달값으로 전달해준다.

결과값은 )

방법 2) 익명 내부 클래스를 사용하는 법이다.

sort () 함수 내부에 익명 클래스를 이용하여 Comparator 객체를 만들고 메서드를 오버라이딩 하여준다. 여기서는 이름순으로 정렬하도록 기준을 정하였다.

결과값)

방법 3) 람다식을 활용 () -> {}

결과 값)

람다식의 경우 매개 변수가 하나이면 () 생략 가능, 반환 값이 없으면 { } 도 생략 가능하다.

< ArrayList 와 List 의 차이 >

List는 인터페이스이고
ArrayList는 List를 상속받는 클래스 이다.

사용법은 매우 비슷하나 큰 차이점을 가진다.
만약 ArrayList라는 인스턴스로 선언하면, 나중에 데이터의 용도가 바뀌어 삽입과 삭제가 유리한 LinkedList 구조로 변경해야 할 때 ArrayList로 선언된 부분은 모둔 바꿔 주어야 하는 일이 생긴다. 또는 ArrayList에서는 지원하지만 LinkedList에서 지원하지 않는 메서드를 사용하려면 더이상 사용 할 수 없게 되니 변경에 유연하지 못한 구조라 할 수 있다.

< List 정렬 >

Integer 타입의 배열을 만들고 이를 다시 List 타입의 객체로 생성하는데 list1은 Arrays의 asList를 사용하고 list2는 ArrayList 타입의 객체로 생성하였다.

list1의 asList는 크기가 고정적인 배열을 만드는 구조라 생성후 .add()로 데이터 추가가 불가하고, ArrayList는 크기가 가변적인 이점이 있기에 .add()로 데이터 추가가 가능하다.

그리고 각 List의 sort()메서드를 사용하여 정렬이 가능하다. sort()는 기본적으로 오름차순 정렬이 되도록 설정 되어 있어 ()매개 값에 null을 지정하여도 정렬이 가능하다. 이번에는 람다식으로 정렬할 기준을 만들어 주어 정렬하도록 하였다.

결과값)

< Comparable >
Comparator와 비슷하게 사용하는 인터페이스 이다. list 안에 객체가 저장되게 되면 그 객체가 하나의 데이터만을 가지는게 아니라 여러 데이터를 포함하고 있다. 이렇게 되면 정렬을 할 때 컴퓨터는 무엇을 기준으로 정렬할지 알 수가 없게 돼서 정렬이 불가능해진다. 그럴때 내부적으로 기준을 심어주어 list 자기 자신 안에 있는 데이터를 비교할수있게 만들어주는 기능이다. 즉 자기 자신이 비교불가능 상태에서 비교 가능한 상태로 만들어준다.

예시)

먼저 클래스로 Item2를 만들고 이름과 가격을 멤버 필드고 가지고 있다.


그리고 객체를 만들어 list2라는 이름의 리스트에 저장을 해주고 지금 이상태로 출력을 하게 되면 에러가 나게 된다. 이유는 충분히 비교가능한 상태가 아니기 때문에 Comparable을 상속받게 되면 구현해야 하는 메서드가 존재하기에 이부분을 오버라이딩 해야 한다.

toString은 객체를 출력하기 위해 오버라이딩 해야 하는 부분이고, compareTo는 자기 자신 this 와 매개 변수 o를 비교한다. compareTo는 기본적으로 오름 차순 정렬로 this - o 가 음수가 나온다면 그대로 유지하고, 양수가 나온다면 this가 뒤로 이동을 한다.

결과)

profile
우당탕탕 지금은 개발중

0개의 댓글