내부클래스(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);
}
}
}
'Dev > Java' 카테고리의 다른 글
[java] 스레드 (0) | 2019.01.28 |
---|---|
[java] ArrayList, List, Map, Generic, Exception (0) | 2019.01.27 |
[java] 추상클래스, 인터페이스 (0) | 2019.01.25 |
[java] Calendar 클래스, Wrapper 클래스, Singleton, final (0) | 2019.01.24 |
[java] 상속, Object 클래스, String클래스, StringBuffer와 StringBuilder (0) | 2019.01.24 |