Dev/Java

[java] 내부클래스, 익명의클래스(Annonymous), Vector

창문닦이 2019. 1. 27. 17:44

내부클래스(inner) 1. 클래스 안에 클래스를 생성. Nested class 클래스는 메소드안, 클래스안에 또 정의해도 문제 없음. 단, 괄호 잘 맞춰줘야 함

class Outer1{ //컴파일 하게되면 Outer1.class

static int a = 10;

int b = 20;

//Inner클래스를 사용하기 위해서는 Outer1클래스를 반드시 객체 생성 해줘야 함

//그런데 Outer1의 객체가 생성 됐다고 Inner가 생성된 건 아니다.

public class Inner1{ //컴파일 하게되면 Outer$Inner.class

int c = 30;

public void write(){

System.out.println(a);

System.out.println(b);

System.out.println(c);

}

}

public void print(){

Inner1 ob = new Inner1(); //첫번째 방법

ob.write();

}

}

public class Test1 {

public static void main(String[] args) {

Outer1 out = new Outer1();

out.print(); //Outer1안에 있는 메소드를 통해서 inner클래스를 생성할 수 있음

Outer1.Inner1 inner = out.new Inner1(); //두번째방법

inner.write();

}

}



내부클래스(Local) 2. 메소드안에 클래스를 생성

class Outer2{

static int a = 10;

int b = 20;

public void write(){

int c = 30;

final int d = 40;

class Local{//메소드안에 클래스를 생성

public void  print(){

System.out.println(a);

System.out.println(b);

System.out.println(c);

System.out.println(d);

}

}

//메소드안에 있는 내부클래스는 메소드 안에서만 객체 생성 가능

Local ob = new Local();

ob.print();

}

}

public class Test2 {

public static void main(String[] args) {

Outer2 out = new Outer2();

out.write();

}

}



내부클래스(Local) 2. 메소드안에 클래스를 생성

class Outer3{

static int a = 10;

int b = 20;

public static class Inner3{

int c = 30;

public void write(){

System.out.println(a);

//System.out.println(b); //static이 아닌 instance변수는 사용할 수 없다.

System.out.println(c);

Outer3 out = new Outer3();

//static클래스는 메모리 할당 알아서 됨. 그래서 거꾸로 Outer 객체생성을 여기서 작성

System.out.println(out.b);

}

}

public void print(){ //이 방법은 의미가 없음. 이미 static이므로 객체생성 되어있음

Inner3 ob = new Inner3();

ob.write();

}

}

public class Test3 {

public static void main(String[] args) {

Outer3 out = new Outer3();

out.print();

Outer3.Inner3 inner = new Outer3.Inner3();

//이 방법은 의미가 없음. 이미 static이므로 객체생성 되어있음

inner.write();

}

}



내부클래스 4. 익명의, Annonymous, 무명의 클래스 메모리 낭비가 적다. 한번 사용하고 버림을 반복. 안드로이드에서 많이 사용 컴파일 할 경우 Test4$1.class 로 만들어짐

public class Test4 {

public Object getTitle(){

return new Object(){//return값이 객체. 객체의 이름이 없음. 메모리의 낭비를 막아줌. 매번 사용하고 끝남.

//주소가 연결되어 있지 않아 garbage collector가 수집.

@Override

public String toString() {

return  "익명의클래스";

}

};

}

public static void main(String[] args) {

Test4 ob = new Test4();

System.out.println(ob.getTitle());

}

}


Collections Framework(방법론) : 데이터를 관리하는 방법 종류가 굉장히 다양. 아래 두개가 가장 대표적(인터페이스) List(Vector, ArrayList) - ArrayList : 동기화지원안함. 그래서 속도 더 빠름 Map(HashSet, HashTable, TreeSet) Collections은 처음부터 몇개 만들어라 정의안해도됨. 10개 만들어짐 인터페이스는 객체를 생성할 수 없음. 인터페이스를 구현해서 사용하는 것일 뿐.

import java.util.Iterator;

import java.util.Vector;

//List(I)

public class Test5 {

public static void main(String[] args) {

Vector v =new Vector(); //Collections Framework(벡터 포함)는 데이터 타입이 Object.

v.add("서울"); //String -> Object Upcast

v.add(30); //int -> Object Upcast

v.add('c'); //char -> Object Upcast

//모든 자료형 add가 가능함. -> Vector는 데이터 타입이 Object

String str;

Integer i;

char c;

str = (String) v.get(0); //Downcast Object를 String으로 형변환시켜서 str에 할당.

//벡터도 0~ 인덱스 일렬번호로 저장됨

System.out.println(str);

i = (Integer) v.get(1);  //Downcast

System.out.println(i);

c = (char)v.get(2);     //Downcast

System.out.println(c);

Iterator it = v.iterator();

while(it.hasNext()){ //어떤 자료형이 들어갔는지 모르니까 downcast하는 반복문 작성

//그래서 Collections 사용시 어떤 자료형인지 정해주는 이유.

//eof, bof로 다음번에 데이터가 있는지 확인

Object o = it.next();

if(o instanceof String){

str = (String)o;

System.out.println();

}else if(o instanceof Integer){

i = (Integer)o;

System.out.println(i);

}else if(o instanceof Character){

c = (char)o;

System.out.println(c);

}

}

}

}



문자열을 벡터에 저장

벡터의 다양한 메소드

add(), get(), firstElement() , lastElement(), size()

import java.util.Iterator;

import java.util.Vector;

public class Test6 {

private static final String city[] = {"서울","부산","대구","인천","광주","대전","울산"};

public static void main(String[] args) {

Vector<String> v = new Vector<String>(); //벡터 v에 String값만 넣겠다. 강제성을 띈 통일성

for(String s : city){

v.add(s);

}

//v.add(10); int형 데이터 넣을 수 없음. 객체생성시 String값만 넣겠다 선언

String str;

str = v.get(0);

System.out.println(str);

str = v.firstElement(); //첫번째 데이터 꺼내올 때. second, third같은건 없음

System.out.println(str);

str = v.lastElement(); //마지막 데이터 꺼내올 때

System.out.println(str);

for(int i=0; i<v.size();i++){ //벡터의 크기:7

System.out.print(v.get(i)+" ");

}

System.out.println();

//----------------------------------------------

for(String s: v){ //벡터도 확장 for문 가능

System.out.print(s + " ");

}

System.out.println();

//---------------------------------------------

//Iterator : 반복자

Iterator<String> it = v.iterator(); //copy의 개념

while(it.hasNext()){ //move의 개념

str = it.next();

System.out.print(str + " " );

}

}

}



벡터의 다양한 메소드


set(), insertElementsAt(), indexOf(), remove() , capacity() , clear()

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<String>();

String str;

System.out.println("벡터의 초기 용량: "+ v.capacity()); //초기용량 10.

for(String c : city){

v.add(c);

}

Iterator<String> it = v.iterator();

while(it.hasNext()){

str = it.next();

System.out.print(str + " ");

}

System.out.println();

//데이터 변경

v.set(0, "Seoul");

v.set(1, "Busan");

for(String s : v){

System.out.print(s + " ");

}

System.out.println();

//-----------------------------------------

//삽입

v.insertElementAt("대한민국", 0);//맨앞에 대한민국을 삽입해라

for(String s: v){

System.out.print(s + " ");

}

System.out.println();

//-----------------------------------------

//검색

int index = v.indexOf("대구");

if(index != -1){ //인덱스 번호가 있다면 해당 데이터가 존재.

System.out.println("검색 성공! : " + index);

System.out.println(v.get(index));

}else{

System.out.println("검색 실패!" + index);

}

//-----------------------------------------

//오름차순 정렬(1~10, ㄱ~ㅎ)

Collections.sort(v);

for(String s : v){

System.out.print(s + " ");

}

System.out.println();

//-----------------------------------------

//내림차순 정렬(10~1, ㅎ~ㄱ)

Collections.sort(v, Collections.reverseOrder());

for(String s : v){

System.out.print(s + " ");

}

System.out.println();

//-----------------------------------------

//삭제

v.remove("Busan"); //v.remove(7);과 동일

for(String s : v){

System.out.print(s + " ");

}

System.out.println();

//-----------------------------------------

//용량 증가

System.out.println("벡터의 초기 용량: "+ v.capacity());

for(int i=1; i<=20; i++){

v.add(Integer.toString(i));

}

System.out.println("벡터의 용량: "+ v.capacity()); //알아서 용량이 늘어남.

for(String s : v){

System.out.print(s + " ");

}

System.out.println();

//-----------------------------------------

//특정 범위 삭제 : v.removeRange(5,20) 없어진 메소드

for(int i=1; i<=10; i++){

v.remove(5);

}

for(String s : v){

System.out.print(s + " ");

}

System.out.println();

System.out.println("특정 범위 삭제 후 벡터의 용량: "+ v.capacity()); //용량은 자동으로 줄어들지 않음.

//수동으로 줄여야함

//-----------------------------------------

//빈공간 삭제

v.trimToSize(); //빈공간 23개가 삭제됨

System.out.println("빈공간 삭제 후 벡터의 용량: "+ v.capacity());

//-----------------------------------------

//모든 데이터 지우기

v.clear();

System.out.println("데이터 갯수: "+ v.size()); //데이터를 지움

System.out.println("벡터의 용량: "+ v.capacity()); //데이터가 지워졌어도 용량은 안바뀜

}

}



클래스를 벡터에 저장할 수 있다

import java.util.Vector;

class Test{

String name;

int age;

}

public class Test8 {

public static void main(String[] args) {

Vector<Test> v =new Vector<Test>(); //벡터의 자료형은 Object. 클래스도 들어갈 수 있다.

//Collection 안에 Test라는 클래스를 집어 넣겠다. 배열에 클래스를 넣은 것과 마찬가지.

Test ob;

ob = new Test(); //여러 데이터를 넣을거라면 반드시 객체생성을 여러번 해줘야 함

ob.name = "배수지";

ob.age = 25;

v.add(ob);

ob = new Test(); //새로운 객체를 생성하지 않으면 동일주소값에 있는 데이터가 변경되버림.

ob.name = "박신혜";

ob.age = 27;

v.add(ob);

//Test ob가 가지고 있는 주소값은 한번 쓰고 필요가 없음. 벡터 v에 다 넣어놨음

for(Test t: v){

System.out.println(t.name + ":" + t.age);

}

}

}