[JAVA+국비교육] 내부클래스(익명의, 무명의, Anonymous클래스), Vector
by 무작정 개발반응형
2022.01.06(13일 차)
날씨가 점점 추워진다. 건강관리에 신경 쓰자!
오늘의 수업 내용
내부 클래스
클래스 안에 클래스를 생성한다.
방법
- 클래스 안에 클래스
- 메서드 안에 클래스
- 클래스를 static으로 만든다
- 무명의 클래스
클래스 안에 클래스
- 내부 클래스(Inner)
package com.day12;
//Test1~3은 뭔지만 보기 자주사용안하고 Test4는 자주 사용함 - 크게 1~3은 크게 중요 x
/*
1. 내부클래스(Inner) - 클래스 안에 클래스가 들어감
방법 :클래스안에 클래스 / 메소드안에 클래스/ 클래스를 static으로 만든다 / 무명의 클래스
*/
class Outer1 { // Outer1클래스 안에 Inner1클래스가 들어감
static int a = 10;//클래스 변수
int b = 20; // instance변수(매개변수)
public class Inner1 {// Outer1클래스 안에 Inner1클래스가 들어감
int c = 30;
public void write() { // Inner클래스 메서드
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
public void print() { // Outer1 클래스 메서드
Inner1 ob = new Inner1(); //객체 생성
ob.write();
}
}
public class Test1 {
public static void main(String[] args) {
Outer1 out = new Outer1();//Outer 객체만들기 - 외부클래스 객체가 먼저 생성되야함
out.print();
Outer1.Inner1 in = out.new Inner1();
in.write();
}
}
메서드 안에 클래스
- 내부 클래스(Local)
package com.day12;
// 2. 내부클래스(Local)
// 메소드 안에 클래스
class Outer2 { // Outer2클래스
static int a = 10;
int b = 20;
public void write() { // write메소드
int c = 30; //지역변수
final int d = 40;
class Inner2 { // 메소드 안에 있는 Inner2클래스
public void print() {
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
Inner2 ob = new Inner2(); // 메소드 안에서만 객체생성 가능
ob.print();
}
}
public class Test2 {
//메소드 안에있는 클래스는 메소드 안에서만 객체생성이 가능하다.
public static void main(String[] args) {
Outer2 out = new Outer2();
out.write();
}
}
static으로 클래스 만들기
- 내부 클래스(중첩)
package com.day12;
//3. 내부클래스(중첩)
//static으로 클래스 만들기
class Outer3 {
static int a = 10;
int b = 20;
public static class Inner3 { //static을 써서 클래스를 만들면 객체를 생성안해도 알아서 메모리에 올라간다.
int c = 30;
public void write() {
System.out.println(a); // static in a =10 먼저 올라가있어서 실행가능
//System.out.println(b); // b는 new를 만나야해서 오류
System.out.println(c); // c는 new가없어도 static클래스라서 먼저 메모리에 올라가있어 실행가능
Outer3 ob = new Outer3();
System.out.println(ob.b);
}
}
public void print() {
System.out.println(b);
}
}
public class Test3 {
public static void main(String[] args) {
Outer3 out = new Outer3();
out.print();
}
}
익명의 클래스( Anonymous 클래스)
- 메모리 낭비가 적다. 한번 사용하고 버림을 반복
- 안드로이드에서 많이 사용함
package com.day12;
//4. 내부클래스(익명의, 무명의, Anonymous클래스)
public class Test4 {
public Object getTitle() {
return new Object() {
@Override
public String toString() {//여기부터
return "익명의 클래스";
}
};// 이게 반환값이 된다. -> 여기까지
}
public static void main(String[] args) {
Test4 ob = new Test4();
Object str = ob.getTitle();//Object로 받아서 찍는다.
System.out.println(str);
}
}
Collections Framework
- 데이터를 관리하는 방법
- 배열의 단점을 해결해 줌
- 종류가 다양하고, 2개가 대표적(인터페이스)
- List(I) - ArrayList(C), Vector(C) I = 인터페이스, C = 클래스
- Vector는 동기화를 지원하는 대신 느리다/ArrayList는 동기화 지원 x 대신 빠르다.
- Map(I) - Hashtable(C), HashSet(C)
- Collections은 처음부터 몇 개를 만들어라 하고 정의 안 해도 됨. 인터페이스는 객체를 생성할 수 없음. 구현해서 사용하는 것일 뿐.
[IT 기술 면접] Java의 Collection Framework 이란?
Collection 종류 - List, Vector, Set, Hashtable, TreeSet, HashSet 등이 있다.
package com.day12;
import java.util.Vector;
// Collection Framework(방법론)
//Collection 종류 - List, Vector, Set, Hashtable, TreeSet, HashSet 등이 있다.
//List(I) - ArrayList(C), Vector(C) I = 인터페이스 , C = 클래스
//Vector는 동기화를 지원하는 대신 느리다/ArrayList는 동기화지원x 대신 빠르다.
//Map(I) - Hashtable(C), HashSet(C)
public class Test5 {
public static void main(String[] args) {
//Vector<E> E는 제러닉이라하는데 이 Vecotr의 자료형을 뭐로 정할지 고르는거 기본은 String이다.
Vector v = new Vector<>(); // Vector(컬렉션모두) 기본 데이터 타입이 Object이다.
v.add("서울"); // 컬렉션은 기본 디폴트가 object이다. 서울은 String인데 object에 넣어서 upcast
v.add(30); //upcast //Object안에 넣는거라 모든것이 upcast이다
v.add('c'); //upcast
//꺼내줄때 는 서울이 Object라서 downcast를 해줘야함 - 형변환
String s = (String)v.get(0);
System.out.println(s);
Integer i = (Integer)v.get(1);
System.out.println(i);
char c = (char)v.get(2);
System.out.println(c);
}
}
문자열을 Vector(벡터)에 저장
Vector의 다양한 메서드
- add()
- get()
- firstElement()
- lastElement()
- size()
package com.day12;
import java.util.Iterator;
import java.util.Vector;
public class Test6 {
private static final String[] city = {"서울", "부산", "대구", "인천", "광주", "대전", "울산"};
public static void main(String[] args) {
//여기서는 downcast를 할 필요가 없다. why? Vector를 String으로 해줘서
Vector<String> v = new Vector<>(); //벡터 v에 String값만 넣겠다. 강제성을 띈 통일성
for(String s : city) {
v.add(s); // add는 추가
}
//v.add(10); -> int형 데이터를 넣을 수 없다.객체 생성 시 String값만 넣겠다고 선언
String str;
str = v.get(0);
System.out.println(str);
str = v.firstElement(); // 데이터가 몇개든 첫번 째꺼 꺼내기
System.out.println(str); // 서울
str = v.get(0); // index 0번째 를 꺼내와라
System.out.println(str); // 서울
str = v.get(1);
System.out.println(str); // 부산
str = v.lastElement(); // 데이터가 몇개가 되든 마지막꺼 꺼내기
System.out.println(str);
//for
for(int i=0; i<v.size(); i++) { // Vector(벡터)의 크기 : 7
System.out.print(v.get(i) + " "); // 서울 부산 대구 인천 광주 대전 울산
}
System.out.println();
//확장for - Vector도 배열처럼 확장 for문 사용 가능
for(String s : v) {
System.out.print(s + " ");
}
System.out.println(); // 서울 부산 대구 인천 광주 대전 울산
//Iterator(전용출력기) - 반복자 - 데이터가 많으면 많을수록 for문 or 확장for보다 더 빠르다.
Iterator<String> it = v.iterator(); // copy의 개념 - vector에 있는 iterator를 써서 데이터를 꺼내서 it에 넣음
while(it.hasNext()) { // move의 개념
str = it.next();
System.out.print(str + " ");
}
}
}
Vector의 다양한 메서드
- set()
- insertElementsAt()
- indexOf()
- remove()
- capacity()
- clear()
package com.day12;
import java.util.Collections;
import java.util.Iterator;
import java.util.Vector;
public class Test7 {
private static final String[] city = {"서울", "부산", "대구", "인천", "광주", "대전", "울산"};
public static void main(String[] args) {
Vector<String> v = new Vector<>(); //Vector은 생성하면 내부적으로 배열을 자동으로 일정개수를 만듬 10개
String str;
System.out.println("백터의 초기 용량 : " + v.capacity()); // 백터의 초기 용량 : 10
for(String s : city) {
v.add(s);
}
Iterator<String> it = v.iterator();
while(it.hasNext()) { //데이터가 있을 때까지 꺼내라
str = it.next();
System.out.print(str + " ");//서울 부산 대구 인천 광주 대전 울산
}
System.out.println();
System.out.println("데이터의 갯수 : " + v.size()); // 데이터의 갯수 : 7
//데이터 변경(수정)
v.set(0, "Seoul"); // 0번째 자리에 "서울"을 넣어라
v.set(1, "Busan");
for(String s : v) {
System.out.print(s + " ");
}
System.out.println();
//데이터 삽입
v.insertElementAt("대한민국", 0); // "대한민국"을 넣을 것이고 0번째 index에 넣는다.
for(String s : v) {
System.out.print(s + " ");
}
System.out.println();
System.out.println("백터의 현재 용량 : " + v.capacity()); // 백터의 현재 용량 : 10
System.out.println("데이터의 갯수 : " + v.size()); // 데이터의 갯수 : 8
//데이터 검색
int index = v.indexOf("대구"); // 대구가 있는 곳의 index를 가지고 와라
if(index != -1) { // -1은 데이터가 없을 경우 -> != 으로 하면 데이터가 있으면
System.out.println("검색 성공!!" + index); // 검색 성공!!3
} else {
System.out.println("검색 실패!!" + index); // 검색 실패!!-1
}
//오름차순
Collections.sort(v);
for(String s : v) {
System.out.print(s + " "); //Busan Seoul 광주 대구 대전 대한민국 울산 인천 -> 가나다순으로 정렬
}
System.out.println();
//내림차순
Collections.sort(v, Collections.reverseOrder());
for(String s : v) {
System.out.print(s + " "); // 인천 울산 대한민국 대전 대구 광주 Seoul Busan
}
System.out.println();
//삭제
v.remove(7); // 삭제할 index번호( ) // v.remove("Busan");
for(String s : v) {
System.out.print(s + " "); // 인천 울산 대한민국 대전 대구 광주 Seoul -> Busan 삭제됨.
}
System.out.println();
//용량 증가
for(int i=1; i<=20; i++) {
v.add(Integer.toString(i));
}
for(String s : v) {
System.out.print(s + " "); // 인천 울산 대한민국 대전 대구 광주 Seoul 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
}
System.out.println();
System.out.println("백터의 현재 용량 : " + v.capacity()); // 백터의 현재 용량 : 40
System.out.println("데이터의 갯수 : " + v.size()); // 데이터의 갯수 : 27
//특정범위 삭제 (tip - 백터는 용량이 알아서 늘어나지면 자동으로 줄어들지는 않음.사용자가 수동으로 줄여야함)
for(int i=1; i<=10; i++) {
v.remove(5); // 5번째 index 광주부터 시작해서 10개의 데이터를 지움
}
for(String s : v) {
System.out.print(s + " "); // 인천 울산 대한민국 대전 대구 9 10 11 12 13 14 15 16 17 18 19 20
}
System.out.println();
System.out.println("백터의 현재 용량 : " + v.capacity()); //백터의 현재 용량 : 40
System.out.println("데이터의 갯수 : " + v.size()); //데이터의 갯수 : 17
//빈공간 공간 삭제(사용자가 수동으로 삭제해야함) - 데이터의 공간만 남기고 남은 빈공간(미사용공간) 삭제
v.trimToSize();
System.out.println();
System.out.println("백터의 현재 용량 : " + v.capacity()); //백터의 현재 용량 : 17
System.out.println("데이터의 갯수 : " + v.size()); //데이터의 갯수 : 17
//모든 데이터 삭제
v.clear();
System.out.println("백터의 현재 용량 : " + v.capacity()); //백터의 현재 용량 : 17
System.out.println("데이터의 갯수 : " + v.size()); //데이터의 갯수 : 0
}
}
Vector(벡터)에 클래스를 저장할 수 있음
package com.day12;
import java.util.Vector;
//Vector안에는 뭐든 다들어간다.배열 안에도 뭐든 다들어간다.
class Test {
String name;
int age;
}
public class Test8 {
public static void main(String[] args) {
Vector<Test> v = new Vector<>(); // Vector의 자료형 : Object / Vector에 Test클래스를 넣는다.
Test ob;
ob = new Test(); // 여러 데이터를 넣을거라면 반드시 객체생성을 여러번 해줘야 함
ob.name = "배수지";
ob.age = 27;
v.add(ob);
ob = new Test();// 새로운 객체생성을 하지 않으면 동일주소값에 있는 데이터가 변경되버림.
ob.name = "유인나";
ob.age = 41;
v.add(ob);
// Test ob가 가지고 있는 주소값은 한번 쓰고 필요가 없음. Vector(벡터) v에 다 넣어놨음
for(Test t : v) {
System.out.println(t.name + ":" + t.age);
}
}
}
개념을 이해는 되지만 코딩으로 녹여서 사용하려고 하니 어렵다.. 역시 코딩은 예습 + 복습!
사람마다 흡수하는 속도는 다르기에 포기하지 않고 달려본다.
반응형
'Language > Java' 카테고리의 다른 글
[JAVA+국비교육] 예외 처리(Exception), 네이버 로그인 만들기 (0) | 2022.01.10 |
---|---|
[JAVA+국비교육] ArrayList, List, Map, Generic (0) | 2022.01.07 |
[JAVA+국비교육] 추상 클래스, 인터페이스, 형변환(upcast, downcast) (0) | 2022.01.05 |
[JAVA+국비교육] Wrapper 클래스, Calendar 클래스(만년달력), 추상클래스, final (0) | 2022.01.04 |
[JAVA+국비교육] 상속, Object 클래스, 생성자, Override, super(), 클래스를 활용해서 계산기 만들기 (0) | 2022.01.03 |
블로그의 정보
무작정 개발
무작정 개발