PC

블로그 이미지

DAVID

'2016/03'에 해당되는 글 12건

제목 날짜
  • 160329: 12회차3 2016.03.29
  • 160328: 11회차5 2016.03.28
  • 160325: 10회차 2016.03.25
  • 160324: 9회차2 2016.03.24
  • 160323: 8회차1 2016.03.23
  • 160322: 7회차4 2016.03.22
  • 160321: 6회차1 2016.03.21
  • 160318: 5일차2 2016.03.18
  • 160317: 4회차3 2016.03.17
  • 160316: 3회차2 2016.03.16

160329: 12회차

Programming 2016. 3. 29. 10:22

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


어제 한 ChatServerThread랑 ChatClientThread에서 보면


Server는 Port를 열어놓고 

InetAddress(IP관련 클래스) - 를 통해서 접속 확인함... -_-);;


// 데이터를 읽어오는 스레드

ChatServerReadHandler read = new ChatServerReadHandler(socket);


// 데이터를 보내는 스레드

ChatServerSendHandler send = new ChatServerSendHandler(socket);



public static void main(String[] args) {

ChatServerThread cs = new ChatServerThread();

cs.serverStart();

}

이렇게 메인에서는 객체 생성을 하고 start() 시켜놓고 있다가 run()당함


class ChatServerReadHandler extends Thread {

private Socket socket;


이런건 스레드의 자식인데 그래서 얘도 스레드


getInputStream()은 아예 리턴타입이


InputStream java.net.Socket.getInputStream() throws IOException


인데 그냥 간단하게 읽어오려고


(new InputStreamReader(socket.getInputStream()) 이렇게 리더로 감쌌음


while (true) {

line = reader.readLine();


그래서 무조건 읽어오는 코드인데


if (line == null) {

break;

}

만약에 라인이 null이면 break함.


이런 식으로 더 이상 데이터가 없을때까지 계속 돌림


new OutputStreamWriter(socket.getOutputStream())

얘도 아웃풋스트림을 롸이터로 감쌌음


롸이터 ㅋㅋㅋㅋㅋ 라이터도 이상하자낰ㅋㅋ

Writer인걸로ㅋㅋㅋㅋㅋㅋㅋㅋ


writer.write(s);

//얘는 그냥 써주는 기능임

writer.newLine(); // 줄바뀜 기호가 있어야 BufferedReader의 readLine()이 인식함

//얘는 \n 기능임

writer.flush(); // client로 전송

//얘는 밀어주는 기능임


-------------------------------------------------------------------------------------

ChatClientThread에서 보면


메소드에서 파라미터로 ip를 받아서 작동함 - 이름이 ip긴한데 i로 해도 상관없지만 그냥 ip를 입력받음... - 도스창에서? 'ㅁ'


InetAddress ia = socket.getInetAddress();

int local_port = socket.getLocalPort();// 접속에 사용된 PORT

//얘는 그냥 접속하기 위해서 얻는 용도고

int server_port = socket.getPort();// 접속에 사용된 PORT

//얘가 진짜 쓰는 포트래 ... -_-);;

String server_ip = ia.getHostAddress(); // 원격 Client IP

//



// 데이터를 읽어오는 스레드

ChatClientReadHandler read = new ChatClientReadHandler(socket);

read.start();

// 데이터를 보내는 스레드

ChatClientSendHandler send = new ChatClientSendHandler(socket);

send.start();



Dave's not here man 인것임니다 -_-);



-------------------------------------------------------------------------------------


[25] import문과 Package문의 활용, 박싱/언박싱,제너릭(Generics)


벌써 25라니 port 계열은 한 10번 봐야 할 거 같다 -_-);;


패키지!

패키지는 클래스들을 그룹으로 묶어 지정하는 것 :>

폴더에서 파일 분류하듯이 - 패키지는 클래스를 그룹별로 분리함 :>


그러니까 폴더랑 똑같은거십니다


클래스는 java.lang을 자동으로 import하니까 선언하지 않아도 됨 :>


   - 패키지 클래스는 반드시 javac -d  . *.java로 컴파일 할것 
                                           ↑  ↑ 
                                           │  │  
                                           │ 기준 폴더(현재 폴더)  
                                           │  
                                           └ 지정된 폴더안에 패키지의 형태로   
                                               폴더를 만든후 컴파일된 클래스 저장 


저기 위에 기준 폴더로 할 경우는 .이고 다른 경우엔 그냥 폴더명 써줘도 된대 -_-);;


에디트플러스로 이용중... 

체험판 ㅠㅠ...프로그램 배우면서 체험판 쓰니까 넘 슬프다


내가 만들어도 체험판으로 쓰려나 ㅠㅠ...


그리고 크랙 만들어서 쓰라하고..




요렇게 해보기 :>


1) 코드 복붙

package corejava; 

public class Star { 
    public String show(){ 
        return "★☆★☆★☆★☆★☆"; 

    } 

    public static void main(String[] args){ 
        Star star = new Star(); 
        System.out.println(star.show()); 
    } 
} 


2) 디렉토리에 가서 javac -d . Star.java

3) corejava 디렉토리 생긴거 확인하고

4) java corejava.Star 하면 나옴


이미 corejava라는 디렉토리가 있으면

Star2.java라는 거 

package corejava; 

public class Star2 { 
    public String show(){ 
        return "★☆★☆★☆★☆★☆"; 

    } 

    public static void main(String[] args){ 
        Star2 star = new Star2(); 
        System.out.println(star.show()); 
    } 
} 

이렇게 만들어도 그냥 그 안에 컴파일 된다.




이렇게 . 대신 폴더 경로를 넣어주면 

.은 자바 파일의 바로 위 경로에 만들어 주는 것... :> - 그러니까 얘가 포함됨 -_-)ㅋㅋ

이클립스에서 패키지 폴더 안에 파일이 있는것처럼 ^ㅁ^



이렇게 잘 만들어진다.


-------------------------------------------------------------------------------------

[2] Eclipse에서의 패키지 처리 및 패키지간 참조 


1. import의 사용 
   - CLASSPATH은 하드디스크상에 클래스들이 어디에 위치하는지 경로를 
       지정하는 역활을 합니다. 
   - import문은 그 경로상에서 어떤 패키지들을 참조(조회)할것인지  
     지정하는 명령어입니다. 따라서 CLASSPATH에 경로가 등록이  
     되었다고 클래스를 사용할 수 있는 것이 아니라 import 문을 이용하여  
     패키지를 지정해야 합니다. 
   - 다른 패키지를 가져다 사용할 경우 선언합니다. 
   - 참고할 패키지의 경로를 지정합니다. 



package corejava;


//import java.text.DecimalFormat;

//임포트를 안하면 소속을 찾지 못해서 오류뜸

//java.text.DecimalFormat;는

//java 폴더 안의 text 폴더 안에 DecimalFormat 클래스가 있는 것

// ㅇㅇ


//import java.text.*; 

// 얘는 그냥 모든 걸 다 쓰겠다고... 

// 자바 텍스트 패키지의 모든것을... -_-+

//어짜피 c처럼 끌고 들어오는 게 아니라서 - 라이부러리 x

// 그냥 *해줘도 상관없음염 


//ctrl+shift + O - 해주면 Organize source 해줘서 임포트 한방에 해줌 

//넘나좋은 이클립스 ㅋㅋㅋㅋㅋㅋ


public class PackTest {


public static void main(String[] args) {

// java.lang 패키지는 자동으로 import됨으로

// import문을 명시할 필요가 없습니다.

java.lang.String su = "2000000";

int isu = Integer.parseInt(su);

java.lang.System.out.println(isu);


DecimalFormat df = new DecimalFormat("#,##0");

String str = df.format(isu);

System.out.println("\\ " + str);

}

}



-------------------------------------------------------------------------------------

[2]. 박싱/언박싱 
   - 기본타입과 참조타입 클래스에서 발생합니다. 
   - 박싱: 기본타입 -> 참조타입 
   - 언박싱: 참조타입 -> 기본타입  
   - 주로 기본타입과 랩퍼클래스에서 이루어 집니다. 



//모르는것: diffrence of int and Integer

//http://includestdio.tistory.com/1


1. Primitive 자료형 - Wrapper 클래스 관계

 int

 primitive 자료형 (long, float, double ...)

 산술 연산이 가능하다.

 null로 초기화 할 수 없다.

 Integer

 Wrapper 클래스 (객체)

 Unboxing을 하지 않으면 산술 연산이 불가능 하지만, null 값을 처리할 수 있다. 

 null 값 처리가 용이하기 때문에 SQL과 연동할 경우 처리가 용이하다.

 DB에서 자료형이 정수형이지만 null 값이 필요한 경우 VO에서 Integer를 사용할 수 있음.




2. int와 Integer간의 변환

- Boxing과 Unboxing이라고 한다.

Boxing

 Primitive 자료형 -> Wrapper 클래스

Unboxing 

 Wrapper 클래스 -> Primitive 자료형


3. Auto boxing / unboxing

- 자바에서는 모든 경우는 아니지만 대부분의 경우에는 자동으로 boxing / unboxing을 해준다.

- 예제 코드

?
1
2
3
int i = 1;
Integer integer = i;    // int -> Integer (Auto boxing)
int i2 = integer;    // Integer -> int (Auto unboxing)

출처: http://includestdio.tistory.com/1


내 블로그는 파워블로거 하려고 올리는 게 아니라 공부한거 읽으려고 올린 거지만 출처는 꼭 씁니다 ㅠㅠ...


package day12;


import java.util.Vector;


public class BoxingUnBoxingMain2 {

public static void prints(Vector vi){

int num = vi.size();

int sum = 0;

for(int j = 0; j<num; j++){

//sum += ((Integer)vi.get(j)).intValue();

sum += (Integer)vi.get(j); //unboxing

}//end for

System.out.println("합 : " + sum);

}

public static void main(String[] args) {

Vector v = new Vector(5,5);

v.add(new Integer(3));

//컬렉션에는 해시코드만 들어가니까! :>

v.add(1); //boxing

//new Integer(1) 이 들어가니까! boxing

v.add(5); v.add(4);

v.add(8); v.add(3);

Integer gg = 3;

//3자리는 사실 해시코드가 들어가야 하니까 오토빡씽

int ff = new Integer(4);

//int는 new 이런거 안받는데 걍 들어가짐 -> 오토언빡싱

int aa = (Integer)v.get(2);

//애드한 2번째꺼 겟 - 근데 얘도 해시코드 들어가있는것

System.out.println("unboxing 예: " + aa);

prints(v);

//모르는것: diffrence of int and Integer

//http://includestdio.tistory.com/1

}

}


--------제너릭도 써봅시다------------- 이거 쓰면 코드가 단순해져서 조음맨


package day12;


import java.util.Vector;


public class BoxingUnBoxingMain {

public static void prints(Vector <Integer> vi){

//vector안에는 Integer만 들어간다고 선언하면 제너릭 :>

//그냥 박싱 언박싱 :> - 형변환 x

int num = vi.size();

int sum = 0;

for(int j = 0; j < num; j++){

sum += vi.get(j); // 얘만 언박싱  - 참조형 -> 기본형 (더해줌)

}

System.out.println("합: " + sum);

}

public static void main(String[] args) {

Vector <Integer> v = new Vector <Integer> (5,5);

/*

* Vector(int size, int incr) 

  size 개의 데이터를 저장할 수 있는 길이의 객체를 생성한다. 

  저장 공간이 부족한 경우 incr 개씩 증가한다.

http://hyeonstorage.tistory.com/208

* */

v.add(1); v.add(5); v.add(4); v.add(8); v.add(3);

//박싱친구들

//아까는 제너릭 아니어서 

//매개변수가 Object였는데

//이번에는 boolean java.util.Vector.add(Integer e)

//인티저! :>

prints(v);

}

}


-------------------------------------------------------------------------------------

[03] Generics 

   - 객체를 저장하는 기술인 Collection Framework의 단점을 개선한 기능
   - 클래스나 메소드에 자료형을 매개변수 형식으로 사용할 수 있는 기능. 
   - Class ArrayList<E>에서 'E'가 있는 곳에는 ArrayList를 선언하고 생성할 때 사용할 실제타입
   - E는 Element(원소)를 말하며, new ArrayList<String>() 이면 'E'는  'String' 클래스를 가르키며,
   < > 안의 String은 유형 매개 변수 (type parameter)이다. 
     따라서 boolean add(Object o) 메소드는 boolean add(String o) 가 된다. 
   - 'E'는 ArrayList의 인스턴스를 만들때 < > 안에 넣는 타입을 말합니다.


응그래요... ㅎㅎ...


에러 나는 경우


package day12;


import java.util.ArrayList; 

import java.util.Iterator; 

import java.util.List; 


public class Generic { 


    public static void main(String[] args) { 

        //ArrayList 객체 10개를 저장할 수 있는 list 객체 변수 선언 

        ArrayList list = new ArrayList(10); 

         

        list.add(new Integer(10)); //Integer 추가 

        list.add("List Test");     //String 추가 


        //객체배열에서 순차적으로 객체를 추출하기위한 Iterator 객체 생성  

        Iterator i = list.iterator();  

         

        Integer su = (Integer)i.next(); 

        System.out.println("su=" + su); 

         

        su = (Integer)i.next();  //ERROR 강제 발생 부분 

        

        //왜냐면 기껏 Integer로 가져와서는 이상하게 받음...

        System.out.println("su=" + su); 

    } 

} 


- Generic 클래스  
   . 제네릭 클래스는 형 매개변수(type parameter)를 가지는 클래스입니다. 
   . 형매개변수는 객체가 생성시 전달받으며 속성이나 메소드의 자료형으로 
     사용됩니다. 



package day12;


class SimpleGeneric<T> {

private T[] values;

private int index;


SimpleGeneric(int len) { // Constructor

values = (T[]) new Object[len];

index = 0;

}


public void add(T... args) {

for (T e : args)

values[index++] = e;

}


public void print() {

for (T e : values)

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

System.out.println();

}

}


public class GenericClassExample {

public static void main(String[] args) {

SimpleGeneric<Integer> gInteger = new SimpleGeneric<Integer>(10);

SimpleGeneric<Double> gDouble = new SimpleGeneric<Double>(10);

gInteger.add(1, 2);

gInteger.add(1, 2, 3, 4, 5, 6, 7);

gInteger.add(0);

gInteger.print();

gDouble.add(10.0, 20.0, 30.0);

gDouble.print();

}

}


이게 왜 자동으로 바뀌는데? -_-);;;;;;

부터 막혔음..


package day12;


class SimpleGeneric<S>{

//클래스 설계도

private S[] values;

private int index;

SimpleGeneric(){

}

SimpleGeneric(int len){

values = (S[]) new Object[len];

index = 0;

}

public void add(S ... args){

//이렇게 하면 동일한 타입 1개든 100개든 받을 수 있음

//근데 타입은 같아야함 :>

//S 타입 200개 (ㅇㅋ)

//S타입 1개 + T타입 2개 = x 

for(S e: args)

values[index++] = e;

}

//foreach 문인데

//S타입 e를 생성 -> args의 각 요소를 표시

//그냥 끝까지 도는 것 :>

//S가 Double이면

//double e : args 같은 것

public void print(){

for(S e : values)

System.out.println(e + " ");//으으 이것도 언박싱

System.out.println();

}

}


public class GenericClassExample {

public static void main(String[] args) {

SimpleGeneric <Integer> gInteger = new SimpleGeneric<Integer>(10);

SimpleGeneric <Double> gDouble = new SimpleGeneric <Double> (10);

gInteger.add(1,2);

//public void add(S ... args) 요렇게 생겨서

//밑에것도 넣고 다 넣을 수 있음 ... 인것 -_-ㅋㅋ

gInteger.add(1,2,3,4,5,6,7);

gInteger.add(0);

gInteger.print();

gDouble.add(10.0, 20.0, 30.0);

gDouble.print(); // 3개밖에 없으니까 나머지 7개는 null값 출력

}

}


-------------------------------------------------------------------------------------

 >>>> MultipleTypeParam.java 


package day12;


class Price<N, V> {

private N[] names;

private V[] values;

private int index;


Price() {

}


Price(int size) {

names = (N[]) new Object[size];

values = (V[]) new Object[size];

index = 0;

}


public void insert (N n, V v){

names[index] = n;

values[index] = v;

++index;

}


public void print() {

for (int i = 0; i < index; i++) {

System.out.println(names[i] + " : " + values[i]);

}

}


}


public class MultipleTypeParam {

public static void main(String[] args) {

Price<String, Integer> p1 = new Price <String, Integer>(10);

Price<String, Double> p2 = new Price <String, Double>(10);

p1.insert("Apple", 1200);

p1.insert("Banana", 2000);

p1.insert("Grape", 4500);

//String, Integer

p2.insert("USD", 943.0);

p2.insert("JPY", 822.86);

p2.insert("EUR", 1273.05);

System.out.println("*** Fruit Price ***");

p1.print();

System.out.println("*** Exchange Rate ***");

p2.print();

}

}


으 졸려! ㅋㅋㅋㅋ

- Generic 인터페이스  
   . 클래스와 마찬가지로 형 매개변수를 가지는 제네릭 인터페이스를 선언합니다. 


  [정의] 
   interface InterfaceName<type parameter>{ 

           // .... interface body 
   } 


그냥 위에것처럼 만들어놓고 구현해다가 쓰면 됨


package day12;


interface GenericInterface<T> {

public void setValue(T x);


public String getValueType();

}


class GenericClass<T> implements GenericInterface<T> {

private T value;


public void setValue(T x) {

value = x;

}


public String getValueType() {

return value.getClass().toString();

// 무슨 타입인지 알려면 getClass인것

}

}


public class GenericInterfaceExample {

public static void main(String[] args) {

GenericClass<Integer> gInteger = new GenericClass<Integer>();

GenericClass<String> gString = new GenericClass<String>();

gInteger.setValue(10);

gString.setValue("Text");

System.out.println(gInteger.getValueType());

System.out.println(gString.getValueType());


// 제너릭 타입은 형이 확정되는 게

// 객체가 생성될 때임!

// 객체 생성 안되면 형 확정 x

}

}


- Generic 메소드 
  .  자바에서 제네릭 프로그램의 단위에는 클래스와 인터페이스, 그리고 
     메소드가 있습니다.  


  [정의] 
   <type parametr>return_type MethodName<parameter>{ 
           // .... method body 
   } 


package day12;


public class GenericMethodExample {

public static <T> void printArgInfo(T arg) {

//호출 시점에서 타입이 확정된다.

System.out.print("Argument Type is " + arg.getClass());

System.out.println(" / Value is " + arg.toString());

}


public static void main(String[] args) {

Integer i = new Integer(10);

char c = 'A';

float f = 3.14f;

printArgInfo(i); // <Integer> void printArgInfo(Integer)

printArgInfo(c); // <Character> void printArgInfo(Character)

printArgInfo(f); // <Float> void printArgInfo(Float)

//내부적으로 boxing 되는것

//파라미터 - 기본형

//내부 - 래퍼로 형변환

}

}


저 퍼런 글자 이후로 기억을 잃음

다시 볼 것...


- 제네릭 클래스와 제네릭 메소드를 모두 가지고 있는 경우 

package day12;

class GenericClass2<T> {
public void printMethodArgInfo(T arg) {
System.out.print("Argument Type is " + arg.getClass());
System.out.println(" / Value is " + arg.toString());
}

public <T> void printGenericMethodArgInfo(T arg) {
//얘는 자기 거 우선임 -_-);;
//클래스 <<<<<< 지꺼(메소드거)
System.out.print("Argument Type is " + arg.getClass());
System.out.println(" / Value is " + arg.toString());
}
}

public class NestedGenericMethodExample {
public static void main(String[] args) {
GenericClass2<String> gc = new GenericClass2<String>();
gc.printGenericMethodArgInfo(10L);
gc.printGenericMethodArgInfo('A');
// gc.printMethodArgInfo(10L); // error - 얘는 타입 매칭이 안되서 주석 풀면 오류남
}
}




어 그래서 자바 끝났나보나맨 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


신남 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


-------------------------------------------------------------------------------------

[01] 데이터베이스 개론 


데이터베이스:

일관성을 유지하며 데이터의 중복을 막은 것

데이터를 검색 / 통합할 수 있는 것

여러 사람이 함께 자료를 열람할 수 있는 것


데이터:

정리되지 않은 정보 + 자료들


  1)  파일 처리 시스템 



데이터들의 연관성이 높아서 유지관리가 어려움

- 한개를 바꾸면 다른 것도 하나 하나 다 바꿔 줘야 함

   - 데이터가 독립된 별개의 파일에 저장되므로 데이터의 유지관리가 어렵다

   - 같은 데이터가 여러 개의 파일에 중복되어 있어서 데이터 변경 시 비효율적이다
   - 데이터의 형식을 응용 프로그램에서 정의하므로 데이터 변경 시 프로그램을 변경해야 한다.


그래서   2)  데이터 베이스 시스템



데이터베이스 매니지먼트 시스템을 도입해서 쟤가 관리하게함



3. 테이블(엔티티)의 구조 


필드(=column) - 열 (실제 데이터)

레코드 - 행 (필드를 묶어놓으면 레코드)


  - 2차원 배열의 형태를 가지고 있습니다. 
   - record는 column의 집합입니다. 
   - table(entity)은 record의 집합입니다. 
   - database는 계정과 테이블의 집합입니다. 
   - field: 컬럼의 값 
   - domain: field의 범위 


   number   wdate       subject      passwd   <----- 컬럼, Attribute(논리적 모델링) 
   ----------------------------------------- 
   1        2005-01-01  안녕하세요.  123      <----- 레코드, 행, Tupple(논리적 모델링)  
   2        2005-01-02  반갑습니다.  123$ 
   3        2005-01-01  안녕하세요.  123 
   4        2005-01-02  반갑습니다.  123$ 
   5        2005-01-01  안녕하세요.  123 
   6        2005-01-02  반갑습니다.  123$ 
             ↑                         ↖  
             │                           테이블(Entity)   
             └------------------------------------- field  


한행: 레코드

한열: 필드(컬럼)


넘나 재밌는것 (외울것)


4. SQL 언어의 종류 

-얘는 자바가 아님 -_-);; 또 다른 언어임 ㅋㅋㅋㅋㅋㅋ 즐겁당




정말 이거같다



  - ANSI SQL92, 99에 기준하여 각 데이터베이스상에서 SQL을 사용할 수 있습니다. 

  - DQL(Data Query Language), 데이터 질의어, 데이터 검색, 출력과 관련된 쿼리 
    . SELECT..FROM..WHERE  //얘는 있는걸 갖다가 검색해서 쓸 때 쓰는것
    씰렉트(뭐를) 패쓰워드 푸롬(위치) 멤바테이블 웨어(조건) 10개만(다갖다써도됨)


  - DML(Data Manapulation Language), 데이터 조작어, 데이터 입력, 수정, 삭제와 관련된 쿼리 
    . INSERT, UPDATE, DELETE // 얘는 데이타 입력 수정 삭제 할 떄 쓰는 거임 -_-)

    인써트도 어쩌구저쩌구가 있는데 나중에 하것지 인서트 인투 어쩌구

업데이트 셋 어쩌구 저저구


  - DDL(Data Definition Language), 데이터 정의어, 테이블 생성 및 삭제, 테이블 구조 수정과 관련된 쿼리 
    . CREATE TABLE, DROP TABLE, ALTER TABLE // 아까 쟤네 어디다가 넣냐고 -> 공간 확보! :> 테이블 형태로 만들어져서 다 테이블임


크리에이트 테이블 - 생성맨

드롭 테이블 - 이건 delete 기능임

알터 테이블 - column이 부족할 때 추가 추가



  - TCL(Transaction Control Language), 트랜잭션 제어 언어, 안정적인 데이터 처리를 위한 데이터 처리와 관련된 명령어 
    . COMMIT, ROLLBACK, SAVEPOINT // 트랜잭션 :>! - 응? 계좌이체?

A라는 계좌에서 B라는 계좌로 돈을 이체시킴!

1) A에서 돈을 뺸다

2) 그 돈을 B라는 계좌로 넣는다


원자성... 어 아톰...뭔데 -_-);; Atomic?  

이힣ㅎㅎㅎ



  - DCL(Data Control Language)데이터 제어 언어, 권한 부여와 관련된 쿼리 
    . GRANT, REVOKE  // ㅋㅋㅋㅋㅋㅋㅋ임 아니네 이건 DBMS가 해준댕 :D 굿



잉 OCP OCJP 볼라면 계정이 있어야한대 _-_) 흐흥


오라클 - 네이버 계정으로 만들었음 

비번은 어.. .아마 잊을듯 -_-)


---점심먹었음 :>----------------------------------------------------------------------------------


이제 


http://www.lectureblue.pe.kr/reqtiles/read.jsp?bbsno=26&nowPage=1&col=&word=&code=1


요깄는거 mysql 쓰고있음


첨에 쓸때 use mysql 해야함 :>


show tables; 하면 가지고 있는 table 볼 수 있음







이거 안 하면 적용이 안 된다 

권한을 서버에 재적용하는것 :>


이거 한 다음엔 

cmd에서

start mysql -u root 하면 못 들어감

start mysql -u root -p1234(비밀번호 칠 때 한칸 띄면 안됨) - 하고 들어가야함




sql은 대소문자 구분 x




javadb라는 데이터베이스 생성

그리고 봤음



다 하면 플러시를 해조야됨미다


# MySQL이 설치된 컴퓨터에서 접근 가능하게 계정을 생성하여 지정 (학원)
GRANT ALL PRIVILEGES ON javadb.* TO javauser@LOCALHOST IDENTIFIED BY '1234';  



로그인 후 (use mysql)

# 등록된 계정 출력 
mysql> SELECT host, user, password FROM user ORDER BY user ASC; 



오 이러면 start mysql -u javauser -p1234 해서 로그인 하면 



mysql 데이터베이스 없어짐 :>


-------------------------------------------------------------------------------------

[27] [MySQL] Data Type, MySQL Connector/J 다운, SQL Explorer의 설치


숫자형은 열라많으니까 그냥 int


char 

varchar 는 좀 중요함


   - CHAR(m)   : 1~255개의 문자 지정, 고정 길이문자, 메모리 낭비가 심함, 
                 속도는 고속, 크기가 고정되어 있는 내용 대상, 코드값 


     CODE   CODE_NAME 
     ----   --------- 
     A001   Seoul 
     A002   Incheon 
     A003   Busan  
     A00_ 
     A0__ 
     A___ 


만약에 요럴 경우면 A00 이면 저런 식으로 냅두는 게 아니라 그냥 뭔가로 채워짐 -_-);;

고정 길이문자의 슬픔인것


그래서 만약에 

     select code from table  
     where code='A' 

요러면 검색이 넘나 어려우니까 저 경우에는 그냥 무조건 4자리 채워줘야함


근데 속도는 좋으니까 크기가 고정되어있는 내용이나 코드값은 해주는게 조음미다


   - VARCHAR(m): 1~255개의 가변 길이 문자 지정, 가변 길이 캐릭터,  
                 메모리 재사용, 속도는 늦음, 크기가 가변적인 내용 대상 

     . title VARCHAR(100): 제목 내용이 10바이트만 사용되면 char와는 다르게 
       나머지 90바이트는 재사용합니다. 

    선언: CODE VARCHAR(4) NOT NULL, 
   

     CODE   CODE_NAME 
     ----   --------- 
     A001   Seoul 
     A002   Incheon 
     A003   Busan  
     A00 
     A0 
     A 

     select code from table  
     where code='A0' 


   - TEXT: 65535개의 문자 지정 가능 

   - MEDIUMTEXT: 16777215개의 문자 지정 
    
   - LONGTEXT: 4GB의 문자 지정 


요런 경우에 얘는 찾아짐!

왜냐면 나머지 크기는 그냥 재사용하니까 :> 얘는 A면 그냥 A임 :>


얘는 왜 속도가 늦냐면 - 계산해서 그럼




3. 날짜형 : DATETIME  8 
            DATE      3  
            TIMESTAMP(8) yyyymmdd 



이런것도 있음 ㅇㅇ


-------------------------------------------------------------------------------------


4시 26분!


4. auto_increment 

   - 레코드를 고유하게 구분하는 역활을 합니다. 

   - 순서대로 정수형 일련번호를 만들어 줍니다. 

   - MSSQL의 IDENTITY(1,1), ORACLE의 SEQUENCE와 같음 

   - 칼럼의 타입은 정수형이어야 한다.  - 필수요소

   - NOT NULL이어야 한다. 반드시 값을 입력해야 한다는 조건입니다. 

   - PRIMARY KEY이어야 한다. 중복된 값이 입력되면 안됩니다. 
    


동명이인 같은 경우에 레코드 구분변호 :>

근데 그냥 편하게 정수형 일련번호를 만들면 중복 가능성이 없음 :>


모든 레코드는 Primary key가 있어야 하는데 이거는 중복된 값이 입력되면 안된다!!


- 테이블의 생성 
  . NOT NULLL: 레코드 추가시 반드시 컬럼값을 명시해야합니다. 


CREATE TABLE bbs( 
    bbsnum  INT          NOT NULL AUTO_INCREMENT PRIMARY KEY, #-2147483648 ~ 2147483647 
    title   VARCHAR(128) NOT NULL,                            #영숫자 128자, 한글64  
    content VARCHAR(200) NOT NULL                              
)ENGINE=MyISAM DEFAULT CHARSET="euckr"; 


Not NULL하면 입력 안하면 안됨미다







show tables() 하면 만든 거 볼 수 있음.



5.자료 삽입하기 
  - 유형1: INSERT INTO 테이블명 VALUES(모든 컬럼의 값 나열); 
  - 유형2: INSERT INTO 테이블명(인서트할 컬럼명) VALUES(나열된 컬럼의 값 나열); #권장 
  

1로 넣으면 내가 다 넣으셔야 함 - 2 추천 :>





내가 입력 안해도 bbsnum이 자동으로 1과 2로 증가됨 :>



 모든 컬럼값을 명시하지 않았음으로 에러가 발생합니다. 

    
   INSERT INTO bbs values('안녕하세요.', '반갑습니다.');     


6. NULL, NOT NULL 
   - NULL인 경우는 INSERT시에 값을 입력하지 않아도 됩니다.  
   - NULL속성일 경우 컬럼값을 입력하지 않으면 "NULL"기호가 값으로 입력됩니다. 
   - NOT NULL일 경우는 컬럼에 반드시 데이터를 INSERT시에 입력해야 합니다. 
   - 컬럼의 값이 NULL인 경우는 데이터가 입력된 적이 없다는 뜻입니다. 






삭제도 할 수 있음

근데 인덱스가 올라가진 않고 중간에 빵꾸나네



---------실습-----------

1. bbs3 테이블 생성

2. bbs3 테이블에 레코드 3개 등록

3. 하나의 레코드에 내용수정

4. 하나의 레코드만 삭제










-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------

5. 수업

진도: 

hw: 


6. 할것


박싱 언박싱!

제네릭


jquary ajecks html5 웹퍼플리셔

'Programming' 카테고리의 다른 글

160404: 16회차  (4) 2016.04.04
160401: 15회차  (5) 2016.04.01
160328: 11회차  (5) 2016.03.28
160325: 10회차  (0) 2016.03.25
160324: 9회차  (2) 2016.03.24
Posted by DAVID

160328: 11회차

Programming 2016. 3. 28. 16:29

종료하기 전 티스토리 네이버 로그아웃 할 것



j-5things.pdf



1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


오늘은 IO 랑 Thread!


IO Stream - 스트림은 연속적인 데이터의 흐름!


<<현재 실행하고 있는 프로그램을 기준으로>>

가지고 있는 데이터를 내보내는 것: 출력 스트림

외부 장치에서 프로그램으로 데이터를 가져오는것: 입력 스트림


스트림은 단반향 구조여서 한 곳으로만 데이터가 전송됨 (출발 -> 목적 지정)


그래서 입력 스트림 따로 / 출력 스트림 따로 만듬 (입구와 출구가 다름) - 단방향 구조!


아오씨 발목 건조해


한글은 유니코드 어쩌구 때문에 InputStream / OutputStream(1바이트짜리) 못 쓰고 Reader랑 Writer(2바이트짜리) 써야함.


     바이트 단위 처리                                                2바이트 문자단위 
    (한글 처리 불가능)                                               (한글 처리 가능) 
     ------------------------------------------------------------------------------- 
     InputStream                 기본 입력 스트림 클래스             Reader 
     OutputStream                기본 출력 스트림 클래스             Writer 

     FileInputStream             파일 입력 스트림 클래스             FileReader 
     FileOutputStream            파일 출력 스트림 클래스             FileWriter 

     BufferedInputStream         버퍼 입력 기능 클래스               BufferedReader 
     BufferedOutputStream        버퍼 출력 기능 클래스               BufferedWriter 

     DataInputStream             데이터 타입을 지정하여 입력할수 있는 클래스 
     DataOutputStream            데이터 타입을 지정해서 출력할수 있는 클래스 

     ObjectInputStream ois;      Class 객체를 읽어 올 수 있습니다.  
     ObjectOutputStream oos;     Class 객체를 출력 할 수 있습니다.  



그렇다

인풋스트림 / 아웃풋스트림에 앞에 파일 붙이면 - 파일로 바이너리 데이터를 입력받고 / 내보내고 

이번에 앞에 버퍼드 붙이면 중간에 버퍼를 사용해서 쌓아놨다가 한꺼번에 데이터를 읽어오고 / 내보내고 


근데 데이터는 2바이트짜리가 없음 ㅇㅇ - 이거는 Data 타입을 (인트 불리언 이런거) 유지하면서 읽어오고 / 내보내고


Object 붙이면 메모리에 있는 (실제 객체의) 데이터를 가져오고 / 내보내고





File 클래스는 파일의 경로명을 다루는 클래스!

파일 객체는 파일과 디렉터리를 다 다룸!

- 삭제랑 디렉터리 생성 등과 같은 걸 할 수 있음

근데 이거 내용을 읽고 쓰려고 스트림을 이용함 - File 객체랑 스트림을 연결해서 파일에 접근함


예제는 디렉터리 만드는 것


package day11;


import java.io.File;

import java.util.Date;


class FileDirectoryMaking {


public boolean make(String fname) {

// 존재하지 않는 파일 만들기

File f = new File(fname); // file 객체 생성 :>

if (f.isDirectory() && f.exists()) { // f가 디렉토리면서 / 존재하면

System.out.println(fname + "가 이미 존재함");

return false; // 끝내야징

}


// 위에서 짤리면

f.setLastModified(new Date().getTime());// 수정일

// 파일객체.setLastModified(현재 날짜) - 현재 날짜 지정 가능

return f.mkdir();

// 디렉토리 만들기 :> - 근데 위치 지정을 안해서 javatest 안에 만들어짐..

// D:\javadb\workspace\javatest 요기 가보면 있음 :>

// eclipse에서는 f5 해주면 확인 가능

}


public boolean renameTo(String fname, String newName) {

File f = new File(fname); // 존재하는 파일 이름 바꾸기

if (!f.exists()) {

System.out.println(fname + "가 없다.");

return false;

}


f.setLastModified(new Date().getTime()); // 수정일

return f.renameTo(new File(newName));

// File 객체의 rename 메소드를 통해서 f가 가리키는 디렉토리의 이름을 바꿈

// 근데 이게 true 인 이유는 - 바꾸는게 성공하면 true를 리턴하니까래 ... -ㅅ-);;

}


public boolean delete(String fname) {

File f = new File(fname);

if (!f.exists()) {// 있어야 지우니까 존재만 찾으면 됨

System.out.println(fname + "가 없다.");

return false;

}


// cf f.deleteOnExit();

return f.delete(); // 지우는게 성공하면 true 리턴

}


}


public class FileDirectoryMakingMain {

public static void main(String[] args) {

FileDirectoryMaking fm = new FileDirectoryMaking();

System.out.println("aaa 디렉토리 생성: " + fm.make("aaa"));

System.out.println("bbb 디렉토리 생성: " + fm.make("bbb"));

System.out.println("디렉토리명 변경  : " + fm.renameTo("aaa", "ccc"));

System.out.println("디렉토리 삭제    : " + fm.delete("bbb"));

}


}



---------------------------------------------------------------------------------------

System.in.read를 이용해서 입력받는 예제 - 키보드를 입력한 예제 중...

alt + 방향키 하면 줄 내려짐 -_-);;


package day11;


import java.io.IOException;


public class ReadFromSystem1 {

public static void main(String[] args) {

byte[] b = new byte[1024];

//바이트 쓰는 이유는 

//int java.io.InputStream.read(byte[] b) throws IOException

//이렇게 리드가 바이트를 받음. ... -_-) 귀찮당


int len = 0;


try {

System.out.println("데이터를 입력하세요: ");

len = System.in.read(b);

//len은 byte형 배열의 입력된 개수를 저장해줌 -_-);;같은 시스템인가보다

System.out.println(len);

} catch (Exception e) {

System.out.println("입력실패");

}


String str = new String(b, 0, len - 2);

//String(b의 , 0부터 , len-2까지) 출력

// String 생성자 중 파라미터가 3개 있는 것을 썼다는 얘기임

// 2 빼는 이유는 엔터가 2바이튼가봐 ... 이거 -2 지우면 엔터도 입력됨


System.out.println(str);


try {

System.out.println("데이터를 입력하세요: ");

len = System.in.read(b);

System.out.write(b, 0, len);

// 이것은 무엇인가... -_-);; ㅎㅎ

//아 쓰라고.. write군


System.in.close();

} catch (IOException e) {

System.out.println("입력실패");

}

}

}

------------------------------------------------------------------------------------


BufferedReader - 한 줄씩 읽어옴



BufferedReader 메소드 

설 명 

String readLine() 

한줄을 읽는다. "\n", "\r"을 만날때 까지 읽어온다.


- readLine() 메소드를 사용하면서 문자 읽기를 더 효율적으로 할 수 있게 됐다.

- 기존의 read() 메소드로 한 문자씩 읽어오는 것보다 한줄씩 읽어서 처리하기에 더 간편하다.



readLine은 \n이나 \r을 만날때 까지 읽어온다.


package day11;


import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;


public class ReadFromFile {

public static void main(String[] args) {

String fname = "src\\day11\\ReadFromFile.java";

// String fname = "src/day11/ReadFromFile.java";

// String 객체명 = "(이클립스프로젝트의)폴더명\\패키지명\\파일명;

// 역슬래시: 2개 / 슬래시: 1개


// 이거는 버퍼 기능을 넣어서 파일 객체를 감싸줌


File f = new File(fname);

// 파일의 경로를 파일 객체에 넣음

String path = f.getAbsolutePath();

// 파일의 절대경로 반환

System.out.println(path);


try {

FileReader fr = new FileReader(f);

BufferedReader br = new BufferedReader(fr);

// 한 글자씩 읽어오면 힘드니까 buffer 기능 추가


StringBuffer sb = new StringBuffer();

// 어 변경될거니까 stringbuffer 씀!


String s = "";

while ((s = br.readLine()) != null) {

sb.append(s + "\n");

// \n 한 이유는 한라인씩 바꿔주려고 :>

}

s = sb.toString();

// 생략해도 되지만 그냥 해줬음


System.out.println(s);


br.close();

fr.close();

// 쓴거 다 close

} catch (Exception e) {

System.out.println(e.toString());

// 한번에 Exception으로 받으려고 File어쩌구Exception 안쓰고

// 그냥 Exception을 씀

}


}

}



- 버퍼를 쓰는 이유: 그냥 쉬우라고 -_-)

- 스트링버퍼에다가 하나씩 박아도 되긴 됨...

- 근데 많이 안쓴다니까 readline으로 쓰는 걸로... 넘이 하는 대로...


append 메소드 모르겠다

응이건 저장된 거 뒤에다가 더 추가하는 거랭

그리고 어렵다 ㅠㅠ



출처: http://zzing8300.tistory.com/104


------------------------------------------------------------------------------------


LineNumberReader는 파워복붙


package day11;


import java.io.InputStreamReader;

import java.io.LineNumberReader;


public class ReadFromLine {

public static void main(String[] args) {

try {

System.out.println("데이타를 입력하세요");

InputStreamReader isr = new InputStreamReader(System.in);

//키보드에서 읽어오는것 :>

//밑에 라인넘버리더가 reader 타입을 파라미터로 받아서

//System.in을 변환작업 해주는거심

LineNumberReader br = new LineNumberReader(isr);

//읽어오는 법: 라인넘버리더 :>

StringBuffer sb = new StringBuffer();

String s = "";

while (!(s = br.readLine()).equals("999")) {//

sb.append(br.getLineNumber() + " " + s + "\n");

//999입력하기 전까지 입력받음

//getLineNumber는 줄 넘버값 써줌

}

System.out.println(sb.toString());

br.close();

isr.close();

} catch (Exception ee) {

System.out.println(ee.toString());

}

}

}


오 이건 재밌는데? (-.-)



------어 이거 타입 질문 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ-------------


------------------------------------------------------------------------------------

package day11;


import java.io.*;


public class FileDirDemo1 {

public static void main(String[] args) {

/*

* System.in: 키보드 standard InputStream new InputStreamReader(System.in):

* 입력을 받아 문자 인코딩을 실행 new BufferedReader();: 입력받은 문자를 버퍼에 저장하는 역활과 저장소

* 역활을 함

* 

* System.in ↑ InputStreamReader(System.in) ↑ new BufferedReader(new

* InputStreamReader(System.in))

* 

* Call By Reference 사용

*/


BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

// 오 버퍼드리더에 바로 넣음 (인풋스트림리더(시스템쩜인))

System.out.print("디렉토리를 입력해 주세요: ");


String directory = "";


try {

directory = in.readLine();// 키보드로부터 입력

} catch (Exception e) {

System.out.println("Error: " + e.toString());

}


File f1 = new File(directory);


if (f1.isDirectory()) {

System.out.println("검색 디렉토리 " + directory);

System.out.println("===============================");

String s[] = f1.list();


for (int i = 0; i < s.length; i++) {

//디렉토리와 파일 조합

File f = new File(directory + "/" + s[i]);

if(f.isDirectory()){

System.out.println(s[i] + ": 디렉토리");

}

else{

System.out.println(s[i] + ": 파일");

}

}

}//end if

else{

System.out.println("지정한 " +directory + " 는 디렉토리가 아님");

}

}

}



잘못 코딩했음 -_-)--------밑에거-------------------------------

package day11;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;

class FileInfo {

public static void main(String args[]) {
System.out.print("파일 이름을 넣으세요: ");

String name = "";

try {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
// 메모리 저장 기능(입력 기능(키보드 장치를 지정함))
name = in.readLine();// 한 라인을 읽어 들임
} catch (Exception e) {
System.out.println("Error: " + e.toString());
}

// file 클래스 객체 생성
File file = new File(name);
if (file.exists()) {
System.out.println("파일 이름 : " + file.getName());
System.out.println("상대 패스 : " + file.getPath());
System.out.println("절대 패스 : " + file.getAbsolutePath());
System.out.println("쓰기 가능 : " + file.canWrite());
System.out.println("읽기 가능 : " + file.canRead());
System.out.println("파일 길이 : " + file.length() + " 바이트");
} else
System.out.println("해당 파일은 존재하지 않습니다.");
}
}

------------------------------------------------------------------------------------


FileWriter! - 파일 쓰기 객체! :>


package day11;


import java.io.*;


public class FileWriterDemo {

public static void main(String[] args) {

String source = "JAVA\n" + "JSP\n" + "EJB\n" + "OJT\n" + "가나다\n";

String fname = "";


try {

System.out.print("저장할 파일명을 입력하세요: ");

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

fname = in.readLine();

} catch (Exception e) {

System.out.println("Error: " + e.toString());

}


try {

FileWriter fw = new FileWriter(fname);

fw.write(source);

fw.close();

System.out.println("파일을 저장했습니다.");


FileReader fr = new FileReader(fname);

int i;

System.out.println("파일을 읽어 옵니다.");

// 한 문자를 읽어 들임, 파일의 끝이라면 -1을 읽음


while ((i = fr.read()) != -1) {

// read()는 리턴형이 int니까 캐릭터로 형변환해줘야함

// -1은 더 읽을 게 없는 것...

// The character read, or -1

// if the end of the stream has been reached


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

System.out.print((char) i);

}

fr.close();

} catch (Exception e) {

System.out.println(e.toString());

}


}

}



---------------------------------------------------------파일 오타


package day11;


import java.io.File;

import java.io.FileReader;

import java.io.FileWriter;


public class CopyFile {

public static void main(String[] args) {

try {

// File 객체를 프로그램 실행시의 인자를 이용하여 생성한다.

// 예를 들어, java CopyFile test.txt output.txt

// test.txt -> args[0]

// output.txt -> args[1]


// 파라미터를 2개를 받았는지 검사

if (args.length != 2) {

System.out.println("---------------- 에러 발생 ----------------");

System.out.println("usage: java CopyFile <원본파일명> <대상파일명>");


// 비 정상적인 종료: 0보다 큰값을 지정

System.exit(1); // 프로그램 종료

}


// 파일 객체 생성

File inputFile = new File(args[0]);// 소스파일명

File outputFile = new File(args[1]);// 생성될 파일명


// FileReader는 데이터를 읽어오는 역할을 합니다.

FileReader in = new FileReader(inputFile);


// FileWriter는 쓰는 역할을 합니다.

FileWriter out = new FileWriter(outputFile);


int c;


// FileReader 클래스 객체에서 파일의 끝까지 읽어서

// FileWriter 클래스에 기록을 합니다.

// 한문자를 읽어 들임, 문자는 내부적으로 문자코드에 기반한

// 숫자형태로 변경되어 처리됩니다.

// EOF -1

while ((c = in.read()) != -1) {

// 파일에 출력

out.write(c);

}


System.out.println("파일 복사가 완료되었습니다.");

// 스트림을 닫아줍니다.

in.close();

out.close();


} catch (Exception e) {

System.out.println(e.toString());

}

}

}


------------------------------------------------------------------복붙이니까 해보기


package day11;


import java.io.*;


public class ReadAndWriteFromFile {

public void readFile(String fn) throws IOException {

FileReader fr = new FileReader(fn);

BufferedReader br = new BufferedReader(fr);

StringBuffer sb = new StringBuffer();

String temp = "";

while ((temp = br.readLine()) != null) {

sb.append(temp + "\n");

}

System.out.println(sb.toString());

br.close();

fr.close();


}


public void readnwrite(String fn, boolean append) throws IOException {

String s = null;

FileWriter fw = new FileWriter(fn, append);// append true

//FileWriter(ㅁㅁ, true) - 기존의 값에 이어가기

//FileWriter(ㅁㅁ, false) - 기존의 갚을 덮어쓰기

PrintWriter pw = new PrintWriter(fw);// flush false

// PrintWriter pw=new PrintWriter(fw, true);//flush true

while (!(s = readbuff()/*문자열리턴*/).equals("999")) { // CTRL+C

pw.println(s);

pw.flush();// PrintWriter(fw, true)일 때는 필요없다.

}

pw.close();

fw.close();

}


public String readbuff() throws IOException {

InputStreamReader isr = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(isr);

return br.readLine();

}


public static void main(String[] args) {

String fname = "aaa.txt";

ReadAndWriteFromFile baw = new ReadAndWriteFromFile();

try {

baw.readnwrite(fname, false);// clear

//baw.readnwrite("aaa.txt",true);//append

baw.readFile(fname);

} catch (Exception ex) {

System.out.println(ex);

}

}

}



---------------------------------------------


데이터 주고받기!!

DataInputStream과 DataOutputStream 이용



package day11;


import java.io.*;


public class WritingDatas {

public void writingData(String fname, boolean append) throws IOException {

FileOutputStream fos = null;

DataOutputStream dos = null;

try {

fos = new FileOutputStream(new File(fname), append);

dos = new DataOutputStream(fos);

dos.writeBoolean(append);

dos.writeByte(123);

dos.writeChar(75);

dos.writeDouble(34.56);

dos.writeFloat(345.23f); // float는 F

dos.writeInt(123);

dos.writeLong(345L); // long 타입은 L

dos.writeUTF("홍길동"); // 문자열은 메소드 이름이 UTF

dos.flush(); // fos.close();

} catch (FileNotFoundException e) {

System.out.println("잘못된 파일이름을 입력했습니다.");

}

}


public void readingData(String fname) throws IOException {

try {

FileInputStream fis = new FileInputStream(new File(fname));

DataInputStream dis = new DataInputStream(fis);

System.out.println("append가능? :" + dis.readBoolean());

System.out.println("read byte :" + dis.readByte());

System.out.println("read char :" + dis.readChar());

System.out.println("read double :" + dis.readDouble());

System.out.println("read float :" + dis.readFloat());

System.out.println("read int :" + dis.readInt());

System.out.println("read long :" + dis.readLong());

System.out.println("read utf :" + dis.readUTF());

dis.close();

} catch (FileNotFoundException e) {

System.out.println("잘못된 파일이름을 입력했습니다.");

}

}


public static void main(String[] args) {

WritingDatas wd = new WritingDatas();

try {

wd.writingData("writed.txt", false);

wd.readingData("writed.txt");

} catch (IOException e) {

e.printStackTrace();

}

}

}

// BYTE 형태로 저장이 되어서 txt 파일을 읽을 수는 없음...

// 육안으로는 불가능 - 컴퓨터는 가능

// 왜 이따구 - inputstream 이라서 -_-);;

// 데이터 타입 유지할 수가 없음...

// 바이너리는_구진것_같다.

// 근데 리더라이터는_무거운것_같다.


------------------------------------------------------------------------------------

>>>>  ObjectInputStream & ObjectOutputStream


오브젝트도 읽고 / 내보내고 가능... -_-);; - ㅇ...

인스턴스 파일 저장하는 과정 이름: 직렬화

직렬화: 얼린다 (-_-);; - 유지는 하는데 사용은 못하게 세이브는 하는것... - 메모리에서 살짝 다른 데 올려놓는 것

-serialization


도로 내보내는 과정: 역직렬화

역직렬화: 직렬화를 통해 유지한 오브젝트를 메모리에 다시 올려놓는 것.


직렬화의 대상이 되는 인스턴스의 클래스는 java.io.Serializable 인터페이스를 구현해야 한다. - implements 하라고...


package day11;


import java.io.*;

//import java.io.FileInputStream;

//import java.io.FileOutputStream;

//import java.io.IOException;

//import java.io.ObjectInputStream;

//import java.io.ObjectOutputStream;

//import java.io.Serializable;


public class Circle implements Serializable {

int xPos;

int yPos;

double rad;


Circle() {

}


Circle(int x, int y, double r) {

xPos = x;

yPos = y;

rad = r;

}


void showCircleInfo() {

System.out.printf("[%d, %d] \n", xPos, yPos);

System.out.println("rad :" + rad);

}


public static void main(String[] args) throws IOException, ClassNotFoundException{

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("Object.ser"));

out.writeObject(new Circle(1, 1, 2.4));

out.writeObject(new Circle(2, 2, 4.8));

out.writeObject(new String("String implements Serializable"));

out.close();

//요기까지가 인스턴스 저장

ObjectInputStream in = new ObjectInputStream(new FileInputStream("Object.ser"));

Circle cl1 = (Circle)in.readObject();

Circle cl2 = (Circle)in.readObject();

String message = (String)in.readObject();

in.close();

//인스턴스 복원

cl1.showCircleInfo();

cl2.showCircleInfo();

System.out.println(message);

//복원된 정보 출력

}

}


직렬화 역직렬화


1. 확장자는 상관 없음

2. 이거왜함?


>>>>> transient - 직렬화의 대상에서 제외됨.

얘는 직렬화의 친구인데 직렬화 안하고 (숨기고) 싶을 때 쓰는 애임


내 파일 누가 가져가서 실행할 때 이 내용은 안나옴 ㅇㅇ


직렬화 하는 이유는

객체 내용을 입출력형식에 구애받지 않고 객체를 파일에 저장함으로서 응 그것들을 네트워크를 통해서 손쉽게 교환이 가능하다...

가 무슨 말이냐면 그냥


객체 내용을 바이트로 변환해서 파일이나 네트워크를 통해서 스트림(송수신)이 가능하게 하는 것 :>


이거 왜 쓰냐면


RMI(뭔지모름-원격객체통신 어쩌구래) - 는 이거는 객체를 그대로 이동시켜야하는데 이럴떄 바이트 어쩌구라서 직렬화 필요 

리모트 - 메쏘드 - 인보케이션 (-_-);;

http://lueseypid.tistory.com/42


http://devbox.tistory.com/entry/Java-%EC%A7%81%EB%A0%AC%ED%99%94

직렬화 넘나 어려운것...


직렬화(Serialization)

 - 객체를 데이터스트림(스트림에 쓰기(write)위한 연속적인(serial) 데이터)으로 만드는 것.

 - 예) 객체를 컴퓨터에 저장했다가 꺼내 쓰기. 네트워크를 통한 컴퓨터 간의 객체 전송.  


역직렬화(Deserialization)

 - 스트림으로부터 데이터를 읽어서 객체를 만드는 것. 


package day11;


import java.io.*;


public class PersonalInfo implements Serializable{


String name;

transient String secretInfo;

int age;

transient int secretNum;

public PersonalInfo(){}

public PersonalInfo(String name, String sInfo, int age, int sNum){

this.name = name;

secretInfo = sInfo;

this.age = age;

secretNum = sNum;

}

public void showCircleInfo(){

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

System.out.println("secret info: " + secretInfo);

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

System.out.println("secret num : " + secretNum);

System.out.println("");

}

public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {

PersonalInfo p1 = new PersonalInfo("Dave", "human", 3, 42);

PersonalInfo p2 = new PersonalInfo("David", "person", 66, 1);

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("obj.ser"));

//인스턴스 저장

out.writeObject(p1);

out.writeObject(p2);

// p1.showCircleInfo();


ObjectInputStream in = new ObjectInputStream(new FileInputStream("obj.ser"));

//인스턴스 복원

PersonalInfo p3 = (PersonalInfo)in.readObject();

p3.showCircleInfo();

PersonalInfo p4 = (PersonalInfo)in.readObject();

p4.showCircleInfo();

PersonalInfo p5 = (PersonalInfo)in.readObject();

p5.showCircleInfo();

//p5까지 만들면

/*

* Exception in thread "main" java.io.EOFException

at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2608)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1319)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)

at day11.PersonalInfo.main(PersonalInfo.java:47)

* */

// 이게 뭔뜻이여 ㅡㅡ

// end of file exception 이었습니다 ^^

//p1.showCircleInfo();

}


}



------------------------------------------------------------------------------------
이제 재미있는 쓰레드

프로세스 - 쓰레드의 집합으로 하나의 돌고있는 프로그램 - 현재 실행되고 있는 프로그램 :>!
프로세스간 자원 공유 불가능!!! - 그래서 프로세스 많이 발생 시키면 자원(메모리) 가 바닥난다.

쓰레드 - 독립된 작업처리 단위로 프로세스를 구성한다.
반복적으로 동기화하여 실행되는 프로그림 루틴이다.
메소드(함수)단위의 처리 모듈이며 프로세스의 구성 요소임

근데 쓰레드는 많이 발생해도 자원을 공유해서 프로세스보다 부담이 적당 :> 꺙
얘네는 동시에 실행되지는 않는다!!

쓰레드 스케줄러에 의해서 스레드의 여러상태중 실행상태로 변경가능!!
   . 각각의 Thread는 자신의 일을 하고 있으며, 동시에 실행되지 않는다. 
    . 스레드 스케줄러에 의해서 스레드의 여러상태중 실행상태로 변경할 수 있다.
    . 스레드의 상태는 준비상태, 실행상태, 대기상태, 정지상태가 있다.
    . 스레드는 자원을 공유하는 특징이 있어 멤버필드와 static 필드를 공유한다. 

run()메소드 안에 처리로직을 구현하거나 / 처리로직을 호출하는 로직이 구현되어있당
자바는 레퍼런스를 참조해서 C언어거보다 속도랑 안정성이 떨어짐... - 그래서 네트워크에선 잘 안씀

쓰레드 예시
스타크래프트 - 실행 (프로세스 시작)
cgv가 미네랄 누르면 미네랄캠 - 쓰레드
다른애가 조패러감 - 쓰레드

http://www.lectureblue.pe.kr/ckstorage/images/java/22/java22_01.jpg

요거 외우기
그러니까 쓰레드 스케줄러에 의해서 준비 -> 실행 가는거고ㅇㅇ

1) 객체 생성
2) start() 준비상태
- 쓰레드 스케줄러(에 등록이 되어서)가 보내줄 때까지 준비상태
3) run() - 실행중인 것 (콜백 메소드 -자동으로!)  
- 근데 쓰레드 스케줄러가 다시 준비상태로 가라면 다시 2)로감 2)<->3)
4) -1) 정지상태! (run 메소드가 실행이 완료된 것) 
4) -2) 대기상태 (실행상태에서 잠깐 빠져나온 상태)
4) -2) -1) sleep() wait() suspend() 가 코드에서 호출되었을 때 3)에서 4)-2)로 감
sleep()은 자기가 준비상태로 갈 시간을 알고 있음 - 자다 일어나서 준비상태로 뾸뾸뾸 감 
다른애들은 굳이 불러줘야 감 

그리고 다시 대기 상태에서 준비상태로 가려면
notify() notifyall() resume()을 코드에서 호출하면 다시 준비상태로감



start()는 콜백 메소드가 아니라서 써줘야함 흥
JVM은 스레드를 실행할 수 있는 여유가 생겼을 때 자신이 작성한 스레드 스케줄러에 의해서
    스레드의 run()메소드를 호출한다.

run()은 JVM이 호출하는 콜백 메소드!
콜백 메소드: 개발자가 호출을 코드상에 지시하는 것이 아니라 JVM이 호출하는 메소드!
콜백 메소드: 그래서 자동으로 호출되어지는것 -_-)ㅋㅋ
이 run()메소드 안에는 스레드 상태에서 처리하려고 하는 모든 비즈니스 로직이 구현되어 있어야 함! :>

sleep()는 지정된 시간동안 스레드를 쉬게 하고 그 시간이 지나면 다시 쓰레드가 작동됨!
wait()는 현재 스레드를 무한정 대기 시킨 후 notify()나 nofityall 메소드를 통해서 재실행함
suspend()는 스레드의 실행을 일시적으로 중지 시킨 것인데 resume() 을 통해서 다시 실행됨

- yield(): 스레드의 실행 권한을 무조건 다른 스레드에게 넘겨 준다.(양보) 
 - stop(): 스레드 실행을 완전히 종료 한다.
 - getName(): 쓰레드의 이름을 알려줍다.
 - Thread.currentThread()는 현재 실행중인 쓰레드를 알려준다. 



단일 스레드
: 메인 메소드가 대표적인 단일 쓰레드! (프로세스에서 디폴트로 할당되는 스레드)
하나의 프로세스가 하나의 쓰레드로 실행되는 환경!
모든 프로세스는 최소한 하나의 쓰레드를 가지게 되며 메인 쓰레드에서 더이상 새로운 쓰레드를 생성하지 않았다면
  이 프로세스는 단일 쓰레드 환경이 된다.

멀티 쓰레드
: 하나의 프로세스에 두 개 이상의 쓰레드가 존재하는 것
- 여러 메소드가 계속적으로 실행상태에 있으면서 자원을 공유하고 이용하는 처리 행태

스레드의 생성 방법
- 스레드 클래스를 상속받는 방법
- Runnable 인터페이스를 구현하는 방법
자바는 다중 상속이 안됨으로 클래스가 특정 클래스를 상속할 필요가 있는 경우는 반드시
     Runnable인터페이스를 구현해야 한다.  


[02] 스레드 실습 
1. 스레드를 이용하지 않은 경우 
>>>>> NonThread.java

파워복붙
package day11;

class GenClass {
private int num;
private String name;

public GenClass(String a, int b) { // 생성자
name = a;
num = b;
}

public void start() {
for (int i = 0; i < num; i++) {
System.out.println(name + " : " + i);
}
}
}

public class NonThread {
public static void main(String args[]) {
GenClass t1 = new GenClass("first", 5);
GenClass t2 = new GenClass("second", 5);
GenClass t3 = new GenClass("third", 5);

t1.start();
t2.start();
t3.start();
}
}
그냥 쓰타트밖에 없음 -_-) 

2. Thread 클래스를 상속받은 경우
-  CallBack Method: JVM이 자신의 실행 스케쥴러를 만들고 거기에 등록된 순서에 따라 자동
호출하는 메소드 


파워복붙


package day11;


class MyThread extends Thread { //쓰레드를 부모로 가짐

//그래서 이거 객체로 만들면 멀티쓰레드임

//쓰레드의 자식이니까 얘도 쓰레드

//엄마건 내거 상속인것

private int num;

private String name;


public MyThread(String a, int b) {

name = a;

num = b;

}


public void run() { // Callback 메소드

for (int i = 0; i < num; i++) {

System.out.println(name + " : " + i);

}

}

}


public class ThreadTest1 {

public static void main(String args[]) {

MyThread t1 = new MyThread("first", 1000);

MyThread t2 = new MyThread("second", 1000);

MyThread t3 = new MyThread("third", 1000);


t1.start();

t2.start();

t3.start();

//이거 돌리면 순위가 매번 다름 ㅇㅇ 쓰레드 스케줄러 마음!!

}

}


3. Runnable 인터페이스를 사용한 경우 
 - 스레드 내용을 가지고 있는 클래스가 추가적인 기능이 필요해 다른 클래스를 상속받는 경우는
   Runnable인터페이스를 implements(구현)해서 사용한다.





package day11;


class ThreadOne implements Runnable {

// 자바는 다중 상속이 안됨으로 클래스가

// 특정 클래스를 상속할 필요가 있는 경우는 반드시

// Runnable 인터페이스를 구현해야 한다.

private int num;

private String name;


public ThreadOne(String a, int b) {

name = a;

num = b;

}


public void run() {

for (int i = 0; i < num; i++) {

System.out.println(name + " : " + i);

}

}

}


public class ThreadTest2 {

public static void main(String args[]) {

// Runnable Interface를 구현한 클래스 객체를

// Thread 클래스의 생성자로 할당합니다.

Thread t1 = new Thread(new ThreadOne("first", 1000));

Thread t2 = new Thread(new ThreadOne("second", 1000));

Thread t3 = new Thread(new ThreadOne("third", 1000));

t1.start();

t2.start();

t3.start();

}

}


runnable - interface라서 implements 해주기 때문에

thread - 얘가 class니까 만약에 다른 애를 extends 했을 경우에 Runnable을 써주면 

쓰레드 대신 쓸 수 있음 - 그래서 씀


4. 쓰레드 기본메소드와 특징확인 


package day11;


class MyRuns implements Runnable {

public void run() {

show();

}


public void show() {

for (int i = 0; i < 100; i++) {

if (((Thread.currentThread()).getName()).equals("a")) {

//스레드가 여러개일 때 현재 스레드.의이름.이 a냐고?(맞으면: true / 아님 false)

System.out.print("a");

// System.out.print("[A"+i+"]");

} else if (((Thread.currentThread()).getName()).equals("b")) {

// System.out.print("[B"+i+"]");

System.out.print("b");

} else if (((Thread.currentThread()).getName()).equals("c")) {

// System.out.print("[C"+i+"]");

System.out.print("c");

} else {

System.out.print("[" + Thread.currentThread().getName() + i + "]");

}

}

}

}


public class MyRunsMain {

public static void main(String[] args) {

MyRuns mr1 = new MyRuns();

Thread t1 = new Thread(mr1, "a");

Thread t2 = new Thread(mr1, "b");

Thread t3 = new Thread(mr1, "c");

// Thread t3=new Thread(mr1);

t1.start();

t2.start();

t3.start();

}

}


//이 코드 돌리면 점유율을 알 수 있슴니다 -_-)ㅋ


5. Thread와 자원 공유 - 멤버필드, static필드 
  - 같은자원(같은 객체의 멤버필드)을 여러개의 쓰레드가 공유할 수 있다. 
  - 문제점발생: 좌석예약, 계좌입출금 등등 
  - 문제점은 동기화 처리(synchronized)로 해결할 수 있다. 


오예 씽크로나이즈드!!

동기화! :D 이예~~~~~~~~~~~~~~ 책에서본거~~~~~~~~~~ 내용은 모르지만~~~


지네 처리할 것을 보장하는 식으로 해결함 ㅇㅇ 넘나조은것


package day11;


class MemberPrint implements Runnable {

//임플리먼츠 때문에 쓰레드임 :>

private int i = 0; //


public void run() {

show();

}


public void show() {

for (; i < 100; i++) {

if (((Thread.currentThread()).getName()).equals("a")) {

System.out.print("[A" + i + "]");

} else if (((Thread.currentThread()).getName()).equals("b")) {

System.out.print("[B" + i + "]");

} else if (((Thread.currentThread()).getName()).equals("c")) {

System.out.print("[C" + i + "]");

}

}

}

}


public class MemberPrintMain {

public static void main(String[] args) {

MemberPrint mr1 = new MemberPrint();

Thread t1 = new Thread(mr1, "a");

Thread t2 = new Thread(mr1, "b");

Thread t3 = new Thread(mr1, "c");

t1.start();

t2.start();

t3.start();

}

}


이따구로는 하면 안되고 아래 예제를 봅시다


package day11;


class StaticLockPrint implements Runnable {

private static int i; //

static {

i = 5;

}


public void run() {

show();

}


public void show() {

synchronized (StaticLockPrint.class) {

//이렇게 막으면 먼저 들어온 애가 다 돌때까지는 접근 못함

for (; i < 100; i++) {

if (((Thread.currentThread()).getName()).equals("a")) {

System.out.print("[A" + i + "]");

} else if (((Thread.currentThread()).getName()).equals("b")) {

System.out.print("[B" + i + "]");

} else if (((Thread.currentThread()).getName()).equals("c")) {

System.out.print("[C" + i + "]");

}

}

} // synchronized

}

}

/*

 * synchronized(StaticLockPrint.class){ for( ;i<100;i++){

 * if(((Thread.currentThread()).getName()).equals("a") ){

 * System.out.print("[A"+i+"]"); }else

 * if(((Thread.currentThread()).getName()).equals("b") ){

 * System.out.print("[B"+i+"]"); }else

 * if(((Thread.currentThread()).getName()).equals("c") ){

 * System.out.print("[C"+i+"]"); } } }

 */ ;


public class StaticLockPrintMain {

public static void main(String[] args) {

StaticLockPrint mr1 = new StaticLockPrint();

StaticLockPrint mr2 = new StaticLockPrint();

StaticLockPrint mr3 = new StaticLockPrint();

Thread t1 = new Thread(mr1, "a");

Thread t2 = new Thread(mr2, "b");

Thread t3 = new Thread(mr3, "c");

t1.start();

t2.start();

t3.start();

}

}



7. 스레드와 sleep 메서드 

package day11;


class SleepThread extends Thread {

public SleepThread(String name) {

setName(name);

}


public void run() {

show();

}


public void show() {

for (int i = 0; i < 50; i++) {

print();

try {

Thread.sleep(50);// 50/1000 초

// sleep 들어가면 setPriority고 뭐고 그냥 반복됨

// 오래 점유하지 못함 -_-);;

} catch (InterruptedException ite) {

}

}

}


public void print() {

System.out.print(getName());// Thread에서

}

}


public class SleepThreadMain {

public static void main(String[] args) {

SleepThread t1 = new SleepThread("a");

SleepThread t2 = new SleepThread("b");

SleepThread t3 = new SleepThread("c");

t2.setPriority(7);// 1~10 클수록 우선순위

//기본 : 5

t1.start();// t2가 t1보다 우선이지만

try {

t1.join();// t1을 끝낸후 t2, t3를 실행한다.

// join();  우선 내거 다 하고 - 다른 애들 기다림

} catch (InterruptedException ite) {

}

t2.start();

t3.start();

}

}




[03] 우선순위 
   - java.lang.MIN_PRIORITY, java.lang.NORM_PRIORITY, java.lang.MAX_PRIORITY 
   - setPriority(int p): 현재 스레드의 우선순위를 인자 p로 설정하기 위한 메소드 
   - getPriority(): 현재 스레드의 우선순위를 반환하는 메소드 
1. sleep()를 적용한 경우 
   - 특정 스레드에 CPU의 자원이 집중하는 것을 막을 수 있다. 


class RunThread2 extends Thread {   
    public RunThread2(String name) { 
        super(name); 
    } 
    public void run() { 
        for ( int i = 1; i <= 30000000 ; i++ ) { 
            if ( i % 50 == 0 ){ 
                System.out.println("Thread [" + getName() + "] : " + i); 
                try{ 
                   //sleep(1); //0.001초 
                   System.out.print(""); 
                }catch(Exception e){ } 
            } 
        } 
    }     
} 
public class SchedulingTest2 { 
    public static void main(String args[]) { 
        Thread[] t = new RunThread2[5]; 
        t[0] = new RunThread2("☆"); 
        t[1] = new RunThread2("★");    
        t[2] = new RunThread2("◆");  
        t[3] = new RunThread2("◇"); 
        t[4] = new RunThread2("○"); 
         
        t[0].start();  
        t[1].start(); 
        t[2].start();          
        t[3].start(); 
        t[4].start(); 
    }  
} 


2. 우선순위를 적용한 예 
   - Thread.MAX_PRIORITY   10 
   - Thread.NORM_PRIORITY  5 
   - Thread.MIN_PRIORITY   1 
   - sleep()의 이용, 우선순위가 적용은 되나 다른 스레드에게 제어권이 자주 넘어감 


package day11;


class RunThread4 extends Thread {

public RunThread4(String name) {

super(name);

}


public void run() {

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

if (i % 50 == 0)

System.out.println("Thread [" + getName() + "] : " + i);


try {

sleep(1); // 0.001초

// 우선순위 해주든지 말든지 sleep 있으면 

// 섞여서 나옴 ㅠㅠ... 강제로 재움..

} catch (InterruptedException e) {

}


}

}

}


public class SchedulingTest4 {

public static void main(String args[]) {

Thread[] t = new RunThread4[3];

t[0] = new RunThread4("☆");

t[1] = new RunThread4("◑");

t[2] = new RunThread4("○");

t[0].start();

t[0].setPriority(1);

t[1].start();

t[1].setPriority(5);

t[2].start();

t[2].setPriority(10);

//sleep 때문에 무쓸모됨 -_-

/*

* System.out.println("t[0]" + t[0].getPriority());

* System.out.println("t[1]" + t[1].getPriority());

* System.out.println("t[2]" + t[2].getPriority());

*/

}

}


------------------------------------------------------------------------------------

[23] NETWORK 이론및 관련클래스, Socket, ServerSocket의 이해 및 실습


1. Intranet / Internet의 구분 
 - 라우터를 기준으로 안쪽을 intranet, 외부를 Internet이라고 합니다.



그래서 학원 거 같은거슨 인트라넷


http://www.lectureblue.pe.kr/ckstorage/images/java/23/java23-01.jpg



  1) IP Address. . . .  . : 172.16.203.31
   - 접속 위치를 나타내는 프로토콜
   - IP는 항구와 같은 위치 정보에 해당하며 컴퓨터를 구분하는 용도로 사용.
   - Port는 항구에서 짐을 싫어 나르는 부두(port)와 같으며 네트워크로 접속되는 지점
   - 하나의 IP에 할당된 여러개의 네트워크 프로그램을 구분하는 용도로 사용.
   - 하나의 포트는 하나의 프로그램과 매핑(연결)됨
   - IP 하나당 사용 가능한 포트 : 0 ~ 65535 (2Byte)
   - 알려진 사용할 수 없는 포트
     20, 21 : FTP, 파일 전송
     22 : Secure Shell 접속
     23 : Telnet, 원격 접속
     25 : SMTP, 메일 전송
     80 : HTTP, Apache, IIS등 웹서버, 인터넷 웹 페이지 서비스
     3306 : MySQL 기본 포트, DBMS
     1521 : Oracle 기본 포트, DBMS
     8080 : Apache, 기타 웹 서버
     1433 : MS-SQL 기본 포트, DBMS
    - 1500번 이하는 시스템이 사용하는 포트가 많음으로 1500번 이상 사용을 권장함.


http://www.lectureblue.pe.kr/ckstorage/images/java/23/java23-02.jpg

3. 네트워크를 지원하는  java.net 패키지의 기본클래스 
  - URL 클래스 
   . URL 클래스는 웹상에 존재하는 자원에 접근하거나 네트웍상의 유일한 주소를 나타내기 위한
   방법을 제공하며, 또한 위치정보를 관리하기 위한 클래스 이다.  
  . 해당 위치에 스트림을 개설할 수 있다.(openStream() 이용) 

 - URL 객체 생성후 스트림 개설 
   URL객체를 생성할때는  MalformedURLException 에러처리를 해야 한다.  
      try{ 
           URL uri = new URL("http", "hostname", 80, "default.htm"); 
           InputStream is = uri.openStream(); 

       }catch(MalformedURLException e){ 
            e.printStackTrace(); 
       } 
        

http://www.lectureblue.pe.kr/ckstorage/images/java/23/java23-03.jpg

호스트 이름: 얘는 고정아이피하고 연결이 되어져 있어서 네임서버가 도메인을 찾아줌 -_-)

http 를 통해서 서버에 요청함 -_-)


/** 

URL 클래스를 이용하는 방법 

**/

import java.net.*;

import java.io.*;


public class URLMain {

public static void main(String args[]) throws MalformedURLException, IOException {

URL url = new URL("http://www.bubblecat.co.kr"); // 인터넷 주소 객체

System.out.println("Port: " + url.getPort());

System.out.println("Protocol: " + url.getProtocol());

System.out.println("HostName: " + url.getHost());

System.out.println("File: " + url.getFile());

System.out.println("Ref: " + url.getRef());

String temp;

BufferedReader br;

br = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));

//한글을 UTF-8 형식으로 변환 - 이거 안쓰면 한글 다 깨짐 -_-);;

while ((temp = br.readLine()) != null) {

System.out.println(temp);

}

br.close();

} // end of main

} // end of URLMain class


------------------------------------------------------------------------------------

InetAddress Class  

: IP주소와 관련된 여러 정보 제공 
  InetAddress의 객체를 생성하기 위해 스태틱의 getByName()메소들 이용한다. 


package day11;


import java.net.*;


class AddressTest {

public static void main(String args[]) throws UnknownHostException {

InetAddress address = InetAddress.getLocalHost();

// getLocalHost() 메소드는 static으로 선언된 클래스 메소드임

//getLocalHost()가 현재 컴퓨터에 대한 it주소나 기타등등 해줌...

System.out.println("로컬 컴퓨터의 이름 : " + address.getHostName());

System.out.println("로컬 컴퓨터의 IP 주소 : " + address.getHostAddress());


address = InetAddress.getByName("java.sun.com");

System.out.println("java.sun.com 도메인 이름과 IP 주소 : " + address);


InetAddress SW[] = InetAddress.getAllByName("naver.com");

for (int i = 0; i < SW.length; i++) {

System.out.println(SW[i]);

}

}

}


 - URLConnection 클래스 
    : URL을 목표지점으로 하는 네트웍 연결을 위한 작업을 수행함
 - URL객체의 스트림 생성과 URLConnection 객체의 스트림 생성 
    : URL 객체 
          URL uri = new URL("http", "hostname", 80, "default.htm"); 
          InputStream is = uri.openStream(); 
    : URLConnection 객체  
         URL uri = URL("http", "hostname", 80, "default.htm"); 
         URLConnection con = uri.openConnection(); 
         InputStream is = uri.getInputStream(); 

   또는

        URL uri = URL("http", "hostname", 80, "default.htm"); 
        URLConnection con = uri.openConnection(); 
        con.setDoOutput(true); //스트림방향을 출력으로 설정 
        OutputStream os  = uri.getOutputStream();             

읽어나 봅시다

넘어갑시다~~~~~

------------------------------------------------------------------------------------

4. Socket, ServerSocket 
   - ServerSocket: 클라이언트보다 먼저 실행되어 클라이언트의 접속 요청을 기다리며, 
     클라이언트가 접속하면 양방향 통신을 할 수 있는 Socket . 객체를 생성한다 
   - Socket: 다른 Socket과 데이터를 송수신 한다.


http://www.lectureblue.pe.kr/ckstorage/images/java/23/java23-04.jpg

- Network 프로그램의 운영순서 
     ⓐ Server: ServerSocket 생성 
     ⓑ Server: 포트감시 시작, Client의 접속을 기다림 
     ⓒ Client: Socket 생성시에 인자 값으로 서버의 IP, PORT를 지정,  서버에 접속 요구 
     ⓓ Server: Client의 요구를 받아 Socket 객체 생성 
     ⓔ Server: 생성된 Socket 객체를 이용해 Client에게 데이터를 보냄 
     ⓕ Client: Socket객체로 데이터를 받고 필요한 데이터를 다시 서버로 전송함 

  

http://www.lectureblue.pe.kr/ckstorage/images/java/23/java23-05.jpg

와 오늘 마ㅣㅇ했읍니다 ㅇㄴㅁㅇㅁㄴㅇㄴㅁㅇㅂ조ㅓㄷㅂㅈ
계속 일거봥ㄴ먕하빈다

그리고 cmd에서 




package day11;

import java.io.*;
import java.net.*;

public class TestServer {
public static void main(String[] args) {
System.out.println("***** 개발자_1 서버 프로그램 작동됨 *****");
ServerSocket server = null;
try {
// 2007 포트로 ServerSocket 생성
server = new ServerSocket(2007);
// 서버 = 소켓(포트)

while (true) { // 데몬이 되기 위한 무한 루프
System.out.println("클라이언트 접속을 대기중입니다.");
Socket client = server.accept(); // Lock

InetAddress ia = client.getInetAddress();
int port = client.getLocalPort();// 접속에 사용된 PORT
// 나가고 - 들어올 때 포트가 필요함 :> - 요기서는 열어놓느라고 필요함

String ip = ia.getHostAddress(); // 원격 Client IP
System.out.println("클라이언트 접속:" + " Local Port: " + port + " IP: " + ip);
// 한글을 출력할 수 있습니다.

// Client로 출력할 객체 생성
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));

// 버퍼에 문자열을 기록함
writer.write("개발자_1 서버에 접속 하신것을 환영 합니다.");

// 실제로 Client로 전송함
writer.flush();
// 밀어줘야지 :> - 데이터를 클라이언트로 보냄

try {
client.close(); // 소켓 닫음
// 도스 상태에서는 지 할거 끝내면 닫히니까
// 구냥 서버 살려놓으려고 트라이캐치문으로 묶어놓음
//
} catch (IOException e) {
System.out.println("Socket을 닫는중 에러 났습니다." + e.toString());
}
}
} catch (IOException ioe) {
System.err.println("Exception generated...");
} finally {
try {
server.close();
System.out.println("서버 작동을 종료합니다.");
} catch (IOException e) {
System.out.println("ServerSocket을 닫는중 에러 났습니다." + e.toString());
}
}
// 아무키나 누를 때까지 대기합니다.
try {
InputStream is = System.in;
is.read();
} catch (Exception e) {

}
System.out.println("서버 프로그램 실행을 종료합니다.");
}
}


----------------------------------------------------------------------------------------
package day11;
import java.io.*; 
import java.net.*; 

public class TestClient { 
    public static void main(String[] args) { 
        System.out.println("클라이언트 프로그램 작동....."); 

        Socket socket = null; 
        try { 
            //args[0]: 접속할 지역의 IP 
            //2007: 접속할 Server Port 
            socket = new Socket(args[0], 2007);   
            //접속 요청! :> - 

            System.out.println("서버에 연결 되었습니다...."); 
             
            InetAddress ia = socket.getInetAddress(); 
            
            int port = socket.getLocalPort();// 접속에 사용된 PORT  
            String ip = ia.getHostAddress(); // 원격 Client IP  
             
            System.out.println("접속한 서버 정보:" + " Local Port: "+ port + " IP: " + ip); 
            //서버로부터 데이터를 입력받아 버퍼에 저장합니다. 
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
             
            //버퍼로부터 한 라인씩 읽어 출력합니다. 
            //Blocking상태에서 기다립니다. 
            String line = reader.readLine(); 
            System.out.println(line); 
        } catch(IOException ioe) { 
            System.err.println("Exception generated..."); 
        } finally { 
            try { 
                socket.close(); 
                System.out.println("서버와의 접속을 종료합니다."); 
            } catch(Exception ignored) {} 
        } 
        //아무키나 누를 때까지 대기합니다. 
        InputStream is = System.in; 
        try{ 
            is.read(); 
        }catch(Exception e){ 
             
        }    
        System.out.println("Client 프로그램 실행을 종료합니다.");         
    } 
} 




------------------------------------------------------------------------------------

------------------------------------------------------------------------------------

------------------------------------------------------------------------------------

------------------------------------------------------------------------------------

------------------------------------------------------------------------------------

------------------------------------------------------------------------------------





5. 수업

진도: 

hw: 


6. 할것

CSF100-AC 

아 이걸로 사냐공ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ


어짜피 구형으로 살 거면 큰거 사고 싶다


아니면 졸라 싸면 피넛으로 사고 싶다 !!!


는 생각


'Programming' 카테고리의 다른 글

160401: 15회차  (5) 2016.04.01
160329: 12회차  (3) 2016.03.29
160325: 10회차  (0) 2016.03.25
160324: 9회차  (2) 2016.03.24
160323: 8회차  (1) 2016.03.23
Posted by DAVID

160325: 10회차

Programming 2016. 3. 25. 13:24

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


오예 컬렉션! :>

컬렉션 쓰면 foreach 문 쓸 수 있음 :> 씬난당!


컬렉션은 클래스인데! - 배열의 단점을 개선한 것 (동적인 크기 변경이 가능해서 메모리 낭비 x)

Set 계열

List 계열

Map 계열이 있음.


java.util패키지의 자바 컬렉션(JCF)에서 자료구조 방법을 제공한다.


1. Set

1) 순서가 없고

2) 중복이 안됨

- HashSet, TreeSet


외우실 것

package day10;


import java.util.*; //자바 유틸 클래스의 모든 객체 임포트


public class SetTest {


// 얘는 왜 스태틱일까

public static void print(Set set) {

Iterator iter = set.iterator();


while (iter.hasNext()) {

String str = (String) iter.next();

System.out.println(str);

}

}


// 얘도 왜 스태틱일까

public static void print(Object[] obj) {


int count = obj.length;


for (int i = 0; i < count; i++) {

System.out.println(obj[i]);

}

}


/**

* @param args

*/

public static void main(String[] args) {

HashSet list = new HashSet();

// 이게 몰까! :>

// 컬렉션의 Set계열 사용해보기 위한

// Hashset 클래스


list.add("lee"); // 0

list.clear(); // 모두 제거

list.add("cho"); // 1

list.add("kim"); // 2

list.add("chung"); // 3

list.add("min"); // 4

list.add("chung"); // 3과 같다! - 중복된 내용 x - 안들어감 :<


System.out.println("set 사이즈: " + list.size());

// cho kim chung min 이라서 4


System.out.println(list.contains("chung"));

// 이건 true false 값 리턴 :>!


list.remove("kim");

// 삭제도 메소드 :>


System.out.println("kim 제거후 set 사이즈: " + list.size());

System.out.println("Iterator 객체 이용해서 set 출력");

// 이터레이터는 비엔나처럼 이어져있는 데이터

// 하나 하나를 접근할 수는 없음 -_-);;


// set은 순서가 없으니까 Iterator 객체를

// 이용해서 출력함 :>


print(list);


/*

* 

* public static void print (Set set){

//Set하고 HashSet이 클래스 연관성이 있는것 - 형변환했음

Iterator iter = set.iterator();

//iterator는 hasNext랑 next가 중요함.

//hasNext = 데이터에서 다음에 가리키는게 있냐고 물어봄

         = 그래서 true 아니면 false를 리턴함 

 

//Next = 데이터를 뽑아내고(가져오고) 다음을 가리키는 것 

 

//요기서는 hasNext가 true이면 Next로 가져오고 -> 다음을 가리키고

// false이면 next로 안가고 종료 :>

while(iter.hasNext()){

String str = (String)iter.next();

System.out.println(str);

}

}

* 

* */


System.out.println("배열을 이용해서 set 출력");


print(list.toArray());

//Set.의 toArray() 메소드를 호출하면 object형 배열로 바뀜

//Object[] :>

/*

public static void print(Object[] obj) {


int count = obj.length;


for (int i = 0; i < count; i++) {

System.out.println(obj[i]);

}

}

*/

}

}



------------------------------------------

2. List
1) 순서가 있고
2) 중복이 가능
-ArrayList, LinkedList, Vector

java.lang.Object  
  | 
  +--java.util.AbstractCollection  
        | 
        +--java.util.AbstractList  
              | 
              +--java.util.ArrayList 

모든 구현 인터페이스:  
Cloneable , Collection , List , RandomAccess , Serializable  



package day10;

import java.util.*;


public class ListTest1 {

//근데 왜 다 스태틱으로 만드는 걸까

public static void print(List list){

Iterator iter = list.iterator();

while(iter.hasNext()){

String str = (String)iter.next();

System.out.println(str);

}

}

public static void print(Object [] obj){

int count = obj.length;

for(int i = 0; i< count; i++){

System.out.println(obj[i]);

}

}

public static void printGet(List set){

int count = set.size();

for(int i = 0;i<count; i++){

System.out.println(set.get(i));

//String str = (String)set.get(i);

}

}

public static void main(String[] args) {

ArrayList list = new ArrayList();

list.add("lee"); //0

list.clear(); // 모두 제거

list.add("cho"); //1

list.add("kim"); //2

list.add("chung"); //3

list.add("min"); //4

list.add("chung"); // 3과 동일하지만 리스트니까 5

System.out.println("ArrayList 사이즈: " + list.size());

System.out.println(list.contains("chung"));

list.remove("kim");

list.remove(3); //오 순서가 있어서 순서대로 지울 수 있음

System.out.println("ArrayList 사이즈: " + list.size());

System.out.println("min이 있는 위치값: " + list.indexOf("min"));

System.out.println("Iterator를 이용해서 출력");

print(list);

/*

* public static void print(List list){

*//리스트 클래스로 받을 수 있는 어레이리스트 

Iterator iter = list.iterator();

while(iter.hasNext()){

String str = (String)iter.next();

System.out.println(str);

}

}

*/

System.out.println("배열을 이용해서 출력");

print(list.toArray());

/*

* public static void print(Object [] obj){

int count = obj.length;

for(int i = 0; i< count; i++){

System.out.println(obj[i]);

}

}


* */

//ArrayList에서 0에서 1까지의 데이터 추출

List sublist = list.subList(0, 2);

//이게 서브스트링 같은 건데 넘나 좋은거임

System.out.println("추출된 데이터만 출력");

print(sublist);

System.out.println("for문을 이용해서 출력");

printGet(list);

/*

* public static void printGet(List set){

int count = set.size();

for(int i = 0;i<count; i++){

System.out.println(set.get(i));

//String str = (String)set.get(i);

}

}

* */

}


}



compact1, compact2, compact3

java.util

Interface Iterator<E>

출처: http://docs.oracle.com/javase/8/docs/api/


이터레이터(Iterator) 인터페이스

- 모든 컬렉션(Collection)으로 부터 정보를 얻을 수 있는 인터페이스 입니다.

- 즉, 자신이 컬렉션(List, Set 등)이라면 이터레이터 인터페이스를 사용할 수 있습니다.


출처: http://bitnori.tistory.com/entry/JAVA-JAVA-ITERATOR-%EC%9E%90%EB%B0%94-%EC%9D%B4%ED%84%B0%EB%A0%88%EC%9D%B4%ED%84%B0


어 구래서 이터레이터는 그냥 인터페이스였습니다


----------------------------------------------------------------------------------------

>>>>> ArrayListTest.java  파워복붙



package day10;


import java.util.ArrayList;


class Jumsu {

// 멤버 변수

String name = "";

int kuk = 0;

int eng = 0;

int tot = 0;

int avg = 0;


public Jumsu() {

// 생성자

}


public Jumsu(String name, int kuk, int eng) {

this.name = name;

this.kuk = kuk;

this.eng = eng;

this.tot = kuk + eng;

this.avg = (kuk + eng) / 2;

}

}


public class ArrayListTest {

public static void main(String args[]) {

int i = 0;


// sungjuk 객체 생성

Jumsu s = null;

Jumsu s1 = new Jumsu("왕눈이", 100, 80);

Jumsu s2 = new Jumsu("아로미", 80, 90);

Jumsu s3 = new Jumsu("투투", 90, 80);


// Vector에 요소 저장

ArrayList v = new ArrayList();

//점수 클래스타입을 오브젝트 클래스타입으로 업캐스팅해서

//사용함

//v.add(오브젝트); <- 같이 생김

v.add(s1);

v.add(s2);

v.add(s3);

//요소는 해시코드를 뜻함 

//리스트에 객체도 저장 가능! :>


// ArrayList에 저장된 sungjuk객체 추출하여 출력

for (i = 0; i < v.size(); i++) {

// Client ---> Object Interface <---> Sungjuk 객체

// Client ---> Sungjuk Interface <---> Sungjuk 객체

s = (Jumsu) v.get(i); 

// 아까 위에서 업캐스팅했으니까

//다시 다운캐스팅 해서 사용함 (멤버 변수가 없으니까 :<)

System.out.print(s.name + "\t");

System.out.print(s.kuk + "\t");

System.out.print(s.eng + "\t");

System.out.print(s.tot + "\t");

System.out.print(s.avg + "\t\n");

}

}

}


----------------------------------------------------------------



Vector!


package day10;


import java.util.*;


import javax.xml.bind.ValidationEvent;


//벡터의 정의 및 요소 검색, 크기 조절

//직계의 기존의 서브 클래스: 스택


public class SearchDelete {

public static void main(String[] args) {

String name[] = { "기획자", "설계자", "개발자" };

// 3개


Vector v = new Vector();


// Vector에 배열 요소 저장

for (int i = 0; i < name.length; i++) {

v.addElement(name[i]);

// 벡터는 v.add와 v.addElement 둘 다 가능

}


// 으아아 잠시 졸았음.


// "개발자" 가 있는지 검사

if (v.contains("개발자")) {

int i = v.indexOf("개발자");

System.out.println("해당 객체의 인덱스 " + (i + 1) + "번째에 있습니다.");

} else {

System.out.println("해당 객체가 없습니다.");

}


// 첫번째 요소 삭제

v.removeElementAt(0);


// 2개 설계자 개발자


System.out.println("지우고 난 후에는");

String s = "";


for (int j = 0; j < v.size(); j++) {

s = (String) v.elementAt(j);

// 값 가져오는 것

System.out.println("Vector " + j + "번째 요소는 " + s);

}

// 설계자개발자


System.out.println("\n초기상태 크기");

System.out.println("엘리먼트의 수는 " + v.size());

// 실제 저장된 객체의 수 - 2개

System.out.println("벡터의 크기는 " + v.capacity());

// 객체를 저장할 수 있는 초기 사이즈 - 모름


System.out.println("\nv.trimToSize()후");

v.trimToSize(); // 값이 할당되지 않았으면 메모리 삭제.

// 첨에는 10개 정도 넣을 수 있는 메모리로 태어남

// 근데 효율적이지가 않아서 trimToSize해줘야합니다

// 또 졸았음 ㅠㅠㅠ


System.out.println("엘리먼트의 수는 " + v.size());

// 실제 저장된 객체의 수 - 2개

System.out.println("벡터의 크기는 " + v.capacity());

// 객체를 저장할 수 있는 초기 사이즈 - 아마 2개?


System.out.println("\n디자이너 요소 추가후");

v.addElement("디자이너");

System.out.println("엘리먼트의 수는 " + v.size());

// 3개

System.out.println("벡터의 크기는 " + v.capacity());

// 아마 3개

// capacity 늘어날 때는 부족할 경우 현재 capacity 보다 2배씩 늘어남


System.out.println("\nCoder 요소 추가후");

v.addElement("Coder");

System.out.println("엘리먼트의 수는 " + v.size());

// 4개

System.out.println("벡터의 크기는 " + v.capacity());

// 아마 4개


v.addElement("PM");

System.out.println("엘리먼트의 수는 " + v.size());

// 5개

System.out.println("벡터의 크기는 " + v.capacity());

// 아마 5개 -> 아니네

}

}


--------------------------------------


성적도 파워복붙

package day10;


import java.util.Vector;


class Sungjuk {

// 멤버 변수

String name = "";

int kuk = 0;

int eng = 0;

int tot = 0;

int avg = 0;


public Sungjuk() {

}


public Sungjuk(String name, int kuk, int eng) {

this.name = name;

this.kuk = kuk;

this.eng = eng;

this.tot = kuk + eng;

this.avg = (kuk + eng) / 2;

}

}


public class VectorTest2 {

public static void main(String args[]) {

int i = 0;


// sungjuk 객체 생성

Sungjuk s = null;

Sungjuk s1 = new Sungjuk("기획자", 100, 80);

Sungjuk s2 = new Sungjuk("설계자", 80, 90);

Sungjuk s3 = new Sungjuk("개발자", 90, 80);


// Vector에 요소 저장

Vector v = new Vector();

v.addElement(s1);

v.addElement(s2);

v.addElement(s3);

// vector에 저장된 sungjuk객체 추출하여 출력

for (i = 0; i < v.size(); i++) {

s = (Sungjuk) v.get(i);

System.out.print(s.name + "\t");

System.out.print(s.kuk + "\t");

System.out.print(s.eng + "\t");

System.out.print(s.tot + "\t");

System.out.print(s.avg + "\t\n");

}

}

}


------------------------------------------------------------


Map


-컬렉션에 포함되어져 있지 않은 그냥 맵구조인것

1) Key 와 Value 한쌍

-HaspMap, Hashtable

-put메소드로 입력한다.


- 중복된 키 값 허용 x - 만약에 쓰면 기존 값 삭제됨

- 검색 결과가 없으면 null 리턴 


list = new Hapmap();

list.put("0", "lee"); <- 이런식으로 삽입함


얘도 iterator를 이용할 수 있다.


/*

 *map

 *key와 value의 한쌍

 *중복된 키값 허용 x - 사용하면 기존 값 삭제 

 */


package day10;


import java.util.*;


public class MapTest {

public static void main(String[] args) {

HashMap list = new HashMap();


list.put("0", "lee");

list.clear();


list.put("1", "cho");

list.put("2", "kim");

list.put("3", "chung");

list.put("4", "min");

list.put("3", "jung"); 

// ↑동일 에러 -> 동일한 키값을 사용해서 chung 지워지고 jung이 들어감


System.out.println(list.size());

System.out.println(list.containsKey("3"));

list.remove("2");


System.out.println(list.size());


print(list);


}


public static void print(Map sets) {

/*

* //static 안쓰면 오류남 Exception in thread "main" java.lang.Error:

* Unresolved compilation problem: Cannot make a static reference to the

* non-static method print(Map) from the type MapTest

* 

* at day10.MapTest.main(MapTest.java:30)

*/

Set set = sets.keySet();

//키값들만 set으로 받음


Iterator iter = set.iterator();

while (iter.hasNext()) {

String key = (String) iter.next();

System.out.println(key + " " + sets.get(key));

//받아온 key값의 value를 출력하는 get()

}


}

}


---------------------------------------------------------------------------------------


package day10;

import java.util.Enumeration;

import java.util.Hashtable;


public class TestHashTable {

public static void main(String[] args) {

Hashtable ht = new Hashtable();

ht.put("AREA01", "대한민국");

ht.put("AREA02", "러시아");

ht.put("AREA03", "중국");

ht.put("AREA04", "일본");

String area = (String)ht.get("AREA01");

//String area = (String)ht.get("AREA05");

if(area != null){

System.out.println(area);

}

else{

System.out.println("검색 지역이 없습니다.");

}

Enumeration e = ht.keys();

//해시테이블은 keys()라는 메소드가 있는데

//이터레이터 같은 거임

//enumeration 타입으로 해시테이블의 키를 받음

while(e.hasMoreElements()){

//이게 hasnext 같은 건가봄

String key = (String)e.nextElement();

System.out.println(key + " = " + ht.get(key));

}

//그러니까 얘는 이터레이터가 무필요

//객체 자체가 keys()라는 메소드가 있어서

//Enumeration 타입으로 쓸 수 있음 :>

}

}



----------------------------------------------------------

-------------------------------------------------------------
Hashtable의 Properties라는 것도 있는데
얘는 파일 입출력 같은 거 써봄

package day10;
//해시테이블의 하위 테이블 (자식인것)
//얘는 키랑 밸류가 문자열로만 저장 가능 :>

//순수 확장자가 properties인 문자열을 읽어다가 저장할 수 있다(?)
//키랑 밸류값 구분법은 = 임

//import java.util.Properties; 
public class ProTest {
public static void main(String[] args) {
// Properties p = new Properties();
java.util.Properties p = new java.util.Properties();
p.put("step1", "JAVA + SCJP");
p.put("step2", "JSP + Oracle + SCWCD");
p.put("step3", "EJB + SCBCD");
p.put("step4", "OJT + MVC2, Framework + 개발");
System.out.println("STEP1:" + p.getProperty("step1"));
System.out.println("STEP2:" + p.getProperty("step2"));
System.out.println("STEP3:" + p.getProperty("step3"));
System.out.println("STEP4:" + p.getProperty("step4"));
}

}
----------------------------------------



package day10;


import java.io.FileInputStream;

import java.util.Iterator;

import java.util.Properties;


public class ProTest2 {

public static void main(String[] args) {

String myinfoPath = "myinfo.properties";

//파일명을 문자열변수 안에 넣는다.

FileInputStream fis = null;

//Stream은 자바의 IO인것 

//인풋스트림 / 아웃풋스트림 있음

Properties pro = new Properties();

//얘 객체 만든 이유는 키와 밸류의 값을 담기 위해

try{

fis = new FileInputStream(myinfoPath);

//이렇게 하면 연결이 된 것...

pro.load(fis);

//load 메소드를 통해서 

//파일의 값을 pro로 읽어옴

}catch(Exception e){

e.printStackTrace();

}

Iterator iter = pro.keySet().iterator();

/*

while(iter.hasNext()){

String key = (String)iter.next();

String value = (String)pro.getProperty(key);

System.out.println(key + " = " + value);


}

//얘는 다 읽어오는거

*/

System.out.println("이름: " + pro.getProperty("name"));

System.out.println("전화: " + pro.getProperty("phone"));

System.out.println("주소: " + pro.getProperty("address"));

//얘는 출력하느라 하나하나 읽어오는것

}

}



이렇게 쓴 것입니다.

-------------------------------------A4에 정리해야함
----------------------------------------수업 안해서 다했음

Iterator 공부해야함

아니 이블로그 짱짱맨임 상줘야함ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

http://egloos.zum.com/iilii/v/3788564

얘는 이터레이터 공부했고

http://seeit.kr/36

얘는 리스트 공부했음 :>! 이힣힣

----------------------------------------------------밥먹음 :>!


1. 업캐스팅


     -  프로그램에서 이루어지는 자동 타입 변환 입니다.
 
     -  서브 클래스의 레퍼런스 값을 슈퍼클래스 타입의 변수에 대입 합니다.

     -  슈퍼 클래스 레퍼런스가 서브 클래스 객체를 가리키게 되는 현상 입니다.

     - 객체 내에 있는 모든 멤버를 접근할 수 없고 슈퍼 클래스의 멤버만 접근
      가능합니다.

복습하려고 복붙하는 업캐스팅의 정의
그러니까 자식 클래스의 해시코드를 부모 클래스 타입의 변수에 대입하면
부모 클래스 해시코드가 자식 클래스 객체를 가리키게 되는 현상임

그러면 객체 내에 있는 모든 멤버는 접근 못 하고 슈퍼클래스 멤버만 접근 가능함.
--------------------------------

예제 복붙하면서 복습하고 있읍니다


package Test_day10;

class DObject {
public DObject next;
//지네 타입 변수를 싱글톤이라고 부르는데 몰라도됨
//어쨌든 멤버 변수를 지 타입으로 만듬 ㅇㅇ...
// class 타입 멤버변수인것

public DObject() {
next = null;
}

public void draw() {
System.out.println("DObject draw");
}
}

class Line extends DObject {
public void draw() { // 메소드 오버라이딩
System.out.println("Line");
}
}

class Rect extends DObject {
public void draw() { // 메소드 오버라이딩
System.out.println("Rect");
}
}

class Circle extends DObject {
public void draw() { // 메소드 오버라이딩
System.out.println("Circle");
}
}

public class MethodOverringEx {
public static void main(String[] args) {
DObject obj = new DObject();
Line line = new Line();
DObject p = new Line();
DObject r = line;

obj.draw(); // DObject.draw() 메소드 실행. "DObject draw" 출력
line.draw(); // Line.draw() 메소드 실행. "Line" 출력
p.draw(); // 오버라이딩된 메소드 Line.draw() 실행, "Line" 출력
r.draw(); // 오버라이딩된 메소드 Line.draw() 실행, "Line" 출력

DObject rect = new Rect();
DObject circle = new Circle();
rect.draw(); // 오버라이딩된 메소드 Rect.draw() 실행, "Rect" 출력
circle.draw(); // 오버라이딩된 메소드 Circle.draw() 실행, "Circle" 출력
}
}


---------------------------------------------------------

package Test_day10;

class Person {
String phone;

public void setPhone(String phone) {
this.phone = phone;
}

public String getPhone() {
return phone;
}
}

class Professor extends Person {
public String getPhone() { // Person의 getPhone()을 오버라이딩
return "Professor : " + super.getPhone(); // Person의 getPhone() 호출
}
}

public class Overriding {
public static void main(String[] args) {
Professor a = new Professor();
a.setPhone("011-123-1234"); // Professor의 getPhone() 호출
System.out.println(a.getPhone());

Person p = a; //업캐스팅
System.out.println(p.getPhone()); // 동적 바인딩에 의해
// Professor의 getPhone() 호출
}
}

---------------------------------------
package Test_day10;

class A {
public A() {
System.out.println("생성자A");
}
} 

class B extends A {
public B() {
System.out.println("생성자B");
}
}

class C extends B {
public C() {
System.out.println("생성자C");
}
}

public class ConstructorEx {
public static void main(String[] args) {
C c;
c = new C();
}
}


-----------------------------------------------

오늘 목표는 구구단!  - 어렵게! -_-ㅋㅋ

ㅇㅇ
------------------------------------

수업시간에 한 건 이거임

package Test_day10;

public class Test12 {
public static void main(String[] args) {
for (int i = 2; i < 9; i = i + 3) {
for (int j = 1; j <= 3; j++) {
System.out.print(i + " * " + j + " = " + (i * j) + "\t");
System.out.print((i + 1) + " * " + j + " = " + (i + 1) * j + "\t");

if ((i + 2) == 10) {
System.out.println("");
continue;
}
System.out.print((i + 2) + " * " + j + " = " + (i + 2) * j + "\n");
}

System.out.println("");
}
}
}

잼슴


------------------------------

package Test_day10;

public class WrapperClassEx {
public static void main(String[] args) {
Integer i = new Integer(10);
char c = '4';
Double d = new Double(3.1234566);
System.out.println(Character.toLowerCase('A')); // 대문자 A를 소문자로 변환

if (Character.isDigit(c)) // 문자 c가 숫자를 나타내면 true
System.out.println(Character.getNumericValue(c)); // 문자 c를 숫자로 변환하여
// 출력

System.out.println(Integer.parseInt("-123")); // 문자열 “-123”을 정수로 변환하여 출력
System.out.println(Integer.parseInt("10", 16)); // 16진수로 표현된 문자열 “10”을
// 정수로 변환하여 출력
System.out.println(Integer.toBinaryString(28)); // 28의 2진수 표현을 나타내는 문자열
// 출력
System.out.println(Integer.bitCount(28)); // 28의 2진수에서 1의 개수출력
System.out.println(Integer.toHexString(28)); // 28의 16진수 표현을 나타내는 문자열 출력
System.out.println(i.doubleValue()); // i값(=10)을 double로 변환하여 출력
System.out.println(d.toString()); // d값(=3.1234566)을 문자열로 변환하여 출력
System.out.println(Double.parseDouble("44.13e-6")); // 문자열 “44.13e-16"을
// double로 변환하여 출력
}
}


//Wrapper

---------------------------------------------------------------------------------------------
package Test_day10;

public class AutoBoxingUnBoxing {
public static void main(String[] args) {
int i = 10;
Integer intObject = i; // auto boxing
// 이거 주소값을 조서 10이 안나올 거 같지만 10이나옴ㅋㅋㅋㅋㅋㅋㅋ
// 자바 5.0 버전부터는 언박싱 오토박싱 기능이 있어서 넘나조은것
// 기본형 타입 -> 해시코드 x
// 이게 사실 Integer intObject = new Integer(10); 이랑 같은 말인것
//
System.out.println("intObject = " + intObject);
i = intObject + 10; // auto unboxing
// 이거는 intObject.Intvalue() 한거랑 같은 거임
// 이게 참조형 타입에 기본형 타입을 담을 수 있는
// 5.0 버전으것

System.out.println("i = " + i);
}
}

---------------잼슴---------------------------------


package Test_day10;

public class StringEx {
public static void main(String[] args) {
String a = new String(" abcd");
String b = new String(",efg");
// 문자열 연결
a = a.concat(b);
System.out.println(a);
// 공백 제거
a = a.trim();
System.out.println(a);
// 문자열 대치
a = a.replace("ab", "12");
System.out.println(a);
// 문자열 분리
String s[] = a.split(","); // a.split("요걸로 구분함")
for (int i = 0; i < s.length; i++)
System.out.println("분리된 " + i + "번 문자열: " + s[i]);
// 서브 스트링
a = a.substring(3);
System.out.println(a);
// 문자열의 문자
char c = a.charAt(2);
System.out.println(c);
}
}

 abcd,efg
abcd,efg
12cd,efg
분리된 0번 문자열: 12cd
분리된 1번 문자열: efg
d,efg
e

------------------------------------------------



4시 51분!
1시간 39분 남았당:>



오 스트링버퍼임! :>
얘는 막 바꿔도 그대로 자기 해시코드임! :>

package Test_day10;

public class StringBufferEx {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("This");
System.out.println(sb.hashCode()); // 생성 후 스트링버퍼 해쉬값 출력
sb.append(" is pencil"); // 문자열 덧붙이기
System.out.println(sb);
sb.insert(7, " my"); // 문자열 삽입
System.out.println(sb);
sb.replace(8, 10, "your"); // 문자열 대치
System.out.println(sb);
sb.setLength(5); // 스트링 버퍼 내 문자열 길이 설정 0 1 2 3 4 까지 나옴
System.out.println(sb);
System.out.println(sb.hashCode()); // 문자열 조작 후 스트링 버퍼의 해쉬 코드
          // 값이 같으면 같은 객체임을 나타낸다.
}
}

----------------------------------------------------

스트링 토크나이저임! :>

오 이거 좋은데 ㅋㅋㅋㅋㅋㅋ - 이거 Split이랑 같이 기억하면 좋음!

package Test_day10;

import java.util.StringTokenizer;

public class StringTokenizerEx {
public static void main(String[] args) {
StringTokenizer st = new StringTokenizer("홍길동/장화/홍련/콩쥐/팥쥐", "/");
// 구분자로 / 사용
//StringTokenizer st = new StringTokenizer("홍길동^장화^홍련^콩쥐^팥쥐", "^");
// 구분자를 이렇게 ^로 지정할 수도 있음
while (st.hasMoreTokens())
System.out.println(st.nextToken());
}
}

-------------------------------------------------


-------------------------------------------------------------------

이제 Exception이랑 interface 할거임!

package Test_day10;

import java.util.Scanner;

public class ExceptionExample2 {
public static void main(String[] args) {
Scanner rd = new Scanner(System.in);
int divisor = 0;
int dividend = 0;

System.out.print("나뉨수를 입력하시오:");
dividend = rd.nextInt();
System.out.print("나눗수를 입력하시오:");
divisor = rd.nextInt();
try {
System.out.println(dividend + "를 " + divisor + "로 나누면 몫은 " + dividend / divisor + "입니다.");
} catch (ArithmeticException e) { // ArithmeticException 예외 처리 블록
System.out.println("0으로 나눌 수 없습니다.");
}
}
}

----------------------------------------------------------

package Test_day10;

public class ArrayException {
public static void main(String[] args) {
int[] intArray = new int[5];
intArray[0] = 0;
try {
for (int i = 0; i < 5; i++) {
intArray[i + 1] = i + 1 + intArray[i]; // i=4인 경우 예외 발생
System.out.println("intArray[" + i + "]" + "=" + intArray[i]);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("배열의 인덱스가 범위를 벗어났습니다.");
}
}
}

----------------------------------------잼슴-------------------

package Test_day10;

public class NumException {
public static void main(String[] args) {
String[] stringNumber = { "23", "12", "998", "3.141592" };
try {
for (int i = 0; i < stringNumber.length; i++) {
int j = Integer.parseInt(stringNumber[i]); // "3.141592"에서 예외 발생
System.out.println("숫자로 변환된 값은 " + j);
}
} catch (NumberFormatException e) {
System.out.println("정수로 변환할 수 없습니다.");
System.out.println(e); //오류 원인 알려줌
}
}
}

--------------------------------------------------------------------

package Test_day10;

interface MobilePhone {
public boolean sendCall();

public boolean receiveCall();

public boolean sendSMS();

public boolean receiveSMS();
}

interface MP3 {
public void play();

public void stop();
}

class PDA {
public int calculate(int x, int y) {
return x + y;
}
}

public class SmartPhone extends PDA implements MobilePhone, MP3 {
// 클래스 상속도 하고 (얜 한개만)
// 인터페이스 구현도 할 수 있는데(얜 여러개 가능)
// 순서가 바뀌면 안됨

// MobilePhone의 추상 메소드 구현
public boolean sendCall() {
System.out.println("전화 걸기");
return true;
}

public boolean receiveCall() {
System.out.println("전화 받기");
return true;
}

public boolean sendSMS() {
System.out.println("SMS 보내기");
return true;
}

public boolean receiveSMS() {
System.out.println("SMS 받기");
return true;
}

// MP3의 추상 메소드 구현
public void play() {
System.out.println("음악 재생");
}

public void stop() {
System.out.println("재생 중지");
}

// 메소드 추가 구현
public void scheduler() {
System.out.println("일정관리");
}

public void applicationManager() {
System.out.println("어플리케이션 설치/삭제");
}

public static void main(String[] args) {
SmartPhone p = new SmartPhone();
p.sendCall();
p.play();
p.calculate(3, 5);
p.scheduler();
}
}

-----------------------------------------------------------

package Test_day10;

interface ISungjuk {
public void setJumsu(int kuk, int eng);

public abstract void print();
}

class Sungjuk implements ISungjuk {
int kuk = 0; // 국어
int eng = 0; // 영어

@Override
public void setJumsu(int kuk, int eng) {
this.kuk = kuk;
this.eng = eng;
}

@Override
public void print() {
System.out.println("성적 증명서");
System.out.println("국어: " + this.kuk);
System.out.println("영어: " + this.eng);
}
}

public class SungjukTest {
public static void main(String[] args) {
// ERROR
// ISungjuk iis = new ISungjuk();

// 인터페이스 = 구현 클래스
ISungjuk is = new Sungjuk();
is.setJumsu(90, 85);
is.print();

}
}

----------------------------------------------------------ㅇㅅㅇ

이제 벡터~~~!!

package Test_day10;

import java.util.Vector;

public class VectorEx {
public static void main(String[] args) {
Vector v = new Vector(); // 디폴트 용량 10의 벡터 생성
v.add("Hello"); // String 객체 요소 삽입
v.add(new Integer(4)); // Integer 객체 요소 삽입
v.add(new Double(3.14)); // Double 객체 요소 삽입
System.out.println("벡터내의 요소 객체 수 :" + v.size()); // 크기는 3
System.out.println("벡터의 현재 용량 :" + v.capacity()); // 용량은 10

for (int i = 0; i < v.size(); i++) {
Object obj = v.get(i); // 해당 인덱스의 요소 얻어오기
if (obj instanceof String) { // String 객체의 경우
String str = (String) obj;
System.out.println(str);
} else if (obj instanceof Integer) { // Integer 객체의 경우
Integer x = (Integer) obj;
int n = x.intValue();
System.out.println(n);
} else if (obj instanceof Double) { // Double 객체의 경우
Double y = (Double) obj;
double d = y.doubleValue();
System.out.println(d);
}
}
}
}

--------------------------위에 코드 중에서 ------------------------------------

Object obj = v.get(i); // 해당 인덱스의 요소 얻어오기
if (obj instanceof String) { // String 객체의 경우
//instanceof = 객체 비교 
//그 객체가 instanceof 스트링타입이면
//요거실행
String str = (String) obj;
System.out.println(str);
} else if (obj instanceof Integer) { // Integer 객체의 경우
//그 객체가 instanceof 인티저타입이면
//요거실행
Integer x = (Integer) obj;
int n = x.intValue();
System.out.println(n);
} else if (obj instanceof Double) { // Double 객체의 경우
//그 객체가 instanceof 더블타입이면
//요거실행

--------------------------------------------------------------------
package Test_day10;

import java.util.Vector;

public class VectorAddEx {
public static void main(String[] args) {
Vector v = new Vector(); // 디폴트 용량 10의 벡터 생성
v.add("Hello");
v.add(new Integer(4));
v.add(new Double(3.14));
v.add(new Integer(5));

int sum = 0;
for (int i = 0; i < v.size(); i++) {
Object obj = v.get(i);
if (obj instanceof Integer) { // Integer 객체의 경우에만 덧셈 수행 - true false 값 출력하는 instanceof
Integer x = (Integer) obj;
int n = x.intValue(); // int값으로 변환
sum += n;
}
}
System.out.println("모든 정수의 합은 : " + sum);
}
}
-------------------------------------------------------------

package Test_day10;

import java.util.*;

public class HashtableEx {
public static void main(String[] args) {
Hashtable h = new Hashtable(); // 디폴트 용량 11의 Hashtable 생성
h.put("21", "홍길동");
h.put("54", "황기태");
h.put("76", "이소룡");
h.put("123", "해리슨포드");
System.out.println("Hashtable의 키 개수 : " + h.size()); // 키의 개수

Enumeration e = h.keys(); // Hashtable의 모든 키들을 얻어옴
//에뉴머레이션 = 이터레이터 친구같은애인데 해시테이블은 얘가 다이렉트로 된당 :>
while (e.hasMoreElements()) {
String key = (String) e.nextElement(); // 키
String value = (String) h.get(key); // 키에 매핑된 값
System.out.println(key + ":" + value);
}
}
}

-------------------------------------------------------------------

package Test_day10;

import java.util.*;

public class HashTableExample {
public static void main(String[] args) {
Hashtable members = new Hashtable(); // 디폴트 용량 11의 Hashtable 생성
Scanner sin = new Scanner(System.in);
System.out.println("공백으로 분리된 이름과 전화번호 5개를 입력하십시오.");
for (int i = 0; i < 5; i++) {
System.out.print("이름, 전화번호 : ");
String name = sin.next(); // 이름 입력
String tel = sin.next(); // 전화번호 입력
members.put(name, tel); // 이름이 키, 전화번호를 값으로 Hashtable에 저장
}
System.out.println("전화번호를 검색할 이름을 입력하십시오.");
String key = sin.next(); // 키인 이름 입력
String val = (String) members.get(key); // 키로 매핑된 전화번호 검색
if (val != null)
System.out.println(key + "의 전화번호는 " + val + "입니다.");
else
System.out.println("입력하신 이름을 찾을 수 없습니다.");

}
}

// 스캐너가 한번에 입력받는 성질이 있어서
// a 1 b 2 c 3 d 4 e 5 입력하고 f 출력해도 나옴...


-----------------------------------------------------------------

package Test_day10;

import java.util.*;

public class IteratorExample {
public static void main(String[] args) {
ArrayList a = new ArrayList(); // 빈 리스트 생성
a.add("Hello");
a.add(3); // 자동 박싱, JDK 1.5 이후에서만 실행됨
// 그래서 요거는 new Integer(3) 이랑 같은거임
a.add(3.14); // 자동 박싱
a.add(2, 3.4); // 자동 박싱, 인덱스 2에 객체 삽입
// 2번째에 3.14말고 3.4를 대입해라 (0 1 2 의 인덱스 2)

Iterator i = a.iterator(); // Iterator 객체 반환
while (i.hasNext()) { // Iterator 객체에 요소가 있을 때 까지 반복
Object obj = i.next(); // 다음 요소 반환
if (obj instanceof String) { // String 객체의 경우
String str = (String) obj;
System.out.println(str);
} else if (obj instanceof Integer) { // Integer 객체의 경우
int n = (Integer) obj; // 자동 언박싱, JDK 1.5 이후에서만 실행됨
//그러니까 이거는 (Integer)obj.intValue(); 한게 생략임
System.out.println(n);
} else if (obj instanceof Double) { // Double 객체의 경우
double d = (Double) obj; // 자동 언박싱, JDK 1.5 이후에서만 실행됨
System.out.println(d);
}
}
}
}

//해시코드값이 참조타입으로 형변환 : 박싱
//참조타입이 기본형으로 형변환 : 언박싱

----------------------------------------------------------


package Test_day10;

import java.util.*;


public class VectorExample {

public static void main(String[] args) {

Vector<Integer> v = new Vector<Integer>(3);

// Integer를 요소로하는 용량 3의 벡터 생성


System.out.println("벡터의 초기 크기는 " + v.capacity());

v.add(new Integer(1));

//이게 벡터가 애초에 Integer를 요소로 하는 걸 생성해서 인티저만 넣어줘야함

v.add(new Integer(22));

v.add(new Integer(51));

v.add(new Integer(10));

//얘들도 다그래 :<

System.out.println("벡터의 크기는 " + v.capacity());

Collections.sort(v); // 요소 순서대로 정렬 - 오름차순

for (int i = 0; i < v.size(); i++) { // 벡터에 있는 모든 요소에 대해 반복

Integer n = v.elementAt(i); // 요소 객체 알아내기

System.out.println(n.toString());

}

}

}


---------------------------------------------------------









5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160329: 12회차  (3) 2016.03.29
160328: 11회차  (5) 2016.03.28
160324: 9회차  (2) 2016.03.24
160323: 8회차  (1) 2016.03.23
160322: 7회차  (4) 2016.03.22
Posted by DAVID

160324: 9회차

Programming 2016. 3. 24. 13:20

종료하기 전 티스토리 네이버 구글 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것

[16]부터 시작!

생성자는 new 할 때 호출됨 :)!


자식 클래스 객체 생성시 - 부모 클래스의 생성자가 먼저 호출! -> 그담에 자식 생성자 호출!

메모리상에 부모 - 자식 만들어지니까


클래스의 기본 생성자 안에는 부모의 기본 생성자를 호출하는 코드가 숨겨져있음.

super(); <- 이거!


package day09;


class TV{

}


class Movie extends TV{

String part = "한국 영화";

}


class Action extends Movie{

String name = "";

}


public class MovieTest_1 {

public static void main(String args[]){

Action act = new Action();

/*

* 요기서 생성자를 호출하는데

* Action()이 없으니까 기본 생성자 

* 자동 호출

* 

* 근데 사실은 Action(){}은

* Action(){

* super();//부모의 기본생성자 호출!

* }

* 가 숨겨져 있는 거임

* 

* 그러면 Movie(){} 안에는

* Movie(){

* super();

* } 가 숨겨져있는거임

* 

* 그러면 또 TV(){} 안에는

* TV(){

* super();

* } 가 숨겨져 있음

* 

* 

* */

act.name = "마파도";

System.out.println(act.name);

}

}


그러니까 생성자는
자식1 호출 -> 부모1(자식1부모) 호출 -> 부모2(부모1부모) 호출
부모2 실행 -> 부모1 실행 -> 자식1 실행
순서로 감

package day09;

class A{
A(){
super();//얘는 부모(Object)의 기본생성자 호출
System.out.println("생성자 A");
}
}

class B extends A{
public B(){
super();//얘도 부모의 기본생성자 호출
System.out.println("생성자 B");
}
}

class C extends B{
public C(){
super(); //부모의 기본생성자 호출!
System.out.println("생성자 C");
}
}

public class ConstructorEx_2 {
public static void main(String[] args) {
C c = new C();
//호출 순서 C -> B -> A  - 부른 애가 엄마를 부릅니다 엄마도 엄마를 부릅니다 x 상속개수만큼
//실행 순서 A -> B -> C - 가장 최상위부터 
}
}

어제 의문이 해결되니까 기분이 좋당 :D

그러니까 생성자의 "첫라인" 에 super()가 있는것.

package day09;
class TV2{
public TV2(){
super();
System.out.println("TV2");
}
}


class Movie2 extends TV2{
String part="한국 영화";
public Movie2(){
super();
System.out.println("Movie2");
}
}

class Action2 extends Movie2{
String name = "";
public Action2(){
super();
System.out.println("Action2");
}
}


public class MovieTest2_3 {
public static void main(String [] args){
Action2 act = new Action2();
System.out.println("생성자 호출 끝");
act.name = "마파도";
System.out.println(act.name);
}
}

그러니까 super는 생성자 중에서도 "기본 생성자"를 호출함.

package day09;


class A1{

A1(){

System.out.println("기본생성자 A1");

}

A1(int x){

System.out.println("int형 생성자 " + x);

}

}


class B1 extends A1{

B1(){

System.out.println("기본생성자 B1");

}

}



public class ConstructorEx2_4 {

public static void main(String[] args) {

B1 b;

b = new B1();

}

}


---------------------------기본생성자가 없으면------------------------

package day09;

class A1{

A1(int x){
System.out.println("int형 생성자 " + x);
}
}

class B1 extends A1{
B1(){
System.out.println("기본생성자 B1");
}
}


public class ConstructorEx2_4 {
public static void main(String[] args) {
B1 b;
b = new B1();
}
}

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Implicit super constructor A1() is undefined. Must explicitly invoke another constructor

at day09.B1.<init>(ConstructorEx2_4.java:11)
at day09.ConstructorEx2_4.main(ConstructorEx2_4.java:20)

오류남 -_-)ㅋㅋ

package day09;

//에러요소가 잠재적으로 존재하는 경우

class Movie3 {
String part = "";

public Movie3() {
System.out.println("Movie3 기본 생성자");
}//기본 생성자

public Movie3(String part) {
this.part = part;
System.out.println("Movie3");
}//String을 받는 기본 생성자
}


class Comedy3 extends Movie3 {
String time = "";
String name = "";

public Comedy3() {

}

public Comedy3(String time, String name) {
//super();
this.time = time;
this.name = name;
System.out.println("Comedy3");
}

}

public class MovieTest3_5 {
public static void main(String [] args) {
// 파라미터가 있는 생성자만 호출합니다.
//잉 부모의 기본 생성자도 호출되는데? - 아 그냥 무조건 super()가 포함되어져 있는거임
//매개변수가 있는 생성자라도 부모는 기본 생성자로 호출한다.
//굳이 파라미터값 넣어주면 매개변수 있는 부모 생성자 호출할 수 있긴 함
Comedy3 com = new Comedy3("21:00", "마파도");

// 기본 생성자는 기존에 생성자가 없는 경우만
// 자동으로 만들어집니다.
Comedy3 com2 = new Comedy3();

// System.out.println(com.time);
// System.out.println(com.name);
}
}



-------------------------------------------------------------------
매개변수가 있는 생성자가 있는 경우에 기본 생성자가 없으면 오류난다.
근데 이거 명시적으로 자식 클래스에서 super(매개변수가 있는 생성자의 변수 타입에 맞는 값) 을 써주던가
그냥 기본 생성자를 만드는 편이 낫다.

package day09;

class A3{
public A3(int x){
System.out.println("생성자 A3");
}
}

class B3 extends A3{
public B3(){
System.out.println("생성자 B3");
}
}

public class ConstructorEx2_6 {
public static void main(String[] args) {
B3 b;
b = new B3();
}
}

이러면


고치는 법 1.


class B3 extends A3{

public B3(){

super(1);

System.out.println("생성자 B3");

}

}

이렇게 고치던가


고치는 법 2.

package day09;


class A3{

A3(){

System.out.println("기본생성자 A3");

}

public A3(int x){

System.out.println("생성자 A3");

}

}


class B3 extends A3{

public B3(){

System.out.println("생성자 B3");

}

}


public class ConstructorEx2_6 {

public static void main(String[] args) {

B3 b;

b = new B3();

}

}


이렇게 그냥 기본 생성자를 만들어준다.

package day09;


class A4 {


A4() {

System.out.println("기본 생성자 A4");

}


public A4(int x) {

System.out.println("매개변수 생성자 A4");

}


}


class B4 extends A4 {

public B4() {

System.out.println("기본 생성자 B4");

}


public B4(int x) {

// 기본적으로 매개변수가 있어도

// super(); //가 생략된 것이라

// 매개변수 있는 생성자도 부모는 기본생성자

// 를 호출한다.


// super(1); //굳이 파라미터값 넣어주면

// 매개변수 있는 생성자 호출 가능


System.out.println("매개변수 생성자 B4");

}


}


public class ConstructorEx3_7 {

public static void main(String[] args) {

B4 b = new B4(10);


}

}


재밌음.

질문 1> 서브 클래스의 인스턴스가 생성될 때 서브 클래스의 생성자와 슈퍼 클래스의 생성자가 모두 실행되는가?

            아니면 서브 클래스의 생성자만 실행되는가?

둘다 실행됨

질문 2> 서브 클래스의 인스턴스가 생성될 때 서브 클래스의 생성자와 슈퍼 클래스의 생성자의 실행 순서는 어떻게 되는가?

실행: 최상위 슈퍼 클래스 -> 최하위 서브 클래스
호출: 최하위 자식 클래스 -> 최상위 부모 클래스

------------------------------------------------------------------------------

this: 메소드안에서 자기 자신을 가리키는 객체 변수
메소드를 호출한 객체의 해시코드(주소)를 가지고 있음
사용 - this.멤버변수 
this() - 현재 클래스 생성자 호출

super: 메소드안에서 상위 클래스 객체를 나타내는 객체 변수
상속에서 부모객체가 은닉이 되버리니까 접근할 수 있는 방법!
사용 - super.멤버변수
super() - 부모 클래스 생성자 호출

생성자: new를 이용하여 메모리 할당이 끝난 후 메모리를 초기화하는 역할을 한다.
멤버 변수에 초기값을 할당한다. 

package day09;
class This{
String area = "서울시";
public void prn(){
// System.out.println("이 메소드를 호출한 객체의 HashCode \n" + this);
//그냥 this라고 쓰면
//16진수 형태의 해시코드가 출력된다
System.out.println("이 메소드를 호출한 객체의 HashCode \n" + this.hashCode());

System.out.println(this.area);
}
}

public class ThisTest_8 {
public static void main(String[] args) {
This obj1 = new This();
obj1.area = "인천시";
obj1.prn();
//객체의 HashCode가 prn() 메소드로 호출된다.
System.out.println("obj1.hashCode()\n" + obj1.hashCode());
}
//this.hashCode()랑 obj1.hashCode()랑 같은거임
//main(static)에서는 객체 생성 전에 메모리를 잡은거라
//static에서는 this나 super는 쓸 수 없음.
}

---------------------------------------------------------

Super!

package day09;

class School{
int year = 0;
public School(){
// System.out.println("생성자1!");
this.year = 0;
}
}

class MiddleSchool extends School{
int year = 0;
//이러면 부모의 year는 은닉됨!
//출력하고 싶으면 super.year
public MiddleSchool(){
// System.out.println("생성자2!");
this.year = 3;
}
public void prn(){
//print였음... -_-);;
System.out.println("year: " + year);
System.out.println("this.year: " + this.year);
System.out.println("super.year: " + super.year);
//super는 부모클래스
}
}



public class SuperTest_9 {
public static void main(String[] args) {
MiddleSchool middleSchool = new MiddleSchool();
middleSchool.prn();
}
}

---------------------------------------------------

package day09;

class SuperObject{
protected String name;
public void paint(){
draw();
}
public void draw(){
System.out.println(name);
}
}


public class SubObject_10 extends SuperObject{
protected String name;
public void draw(){
name = "Sub";
super.name = "Super";
super.draw();
System.out.println(name);
}
//그럼 출력이
//super - sub
public static void main(String[] args) {
SuperObject b = new SubObject_10();
//이거 ... 업캐스팅!
b.paint();
//그래서 SuperObject의 name을 호출해도
//은닉되어져서 super.draw()을 호출하지 않으면
//SubObject_10의 draw()가 출력된다.
System.out.println(b.name);
//근데 왜 b.name은 Super로 나오지...
//왜 안 Sub여 - 은닉이라며!
//아 변수는 오버라이딩 개념이 아니었슴미다
//아 머리아파!
//오버로딩 오버라이딩은 메소드에만 적용됨
}
}

this() 생성자는 파워복붙했음

파워복붙

package day09;
class ThisData{ 
    int i; 
    int j; 
    int k; 
     
    //ⓐ 
    public ThisData(){ 
        this.i=0; 
        this.j=0; 
        this.k=0; 
    } 
     
    //ⓑ 
    public ThisData(int i){ 
        this.i=i; 
    } 
     
    //ⓒ 
    public ThisData(int i, int j){ 
    //super();
        this(i);  //ⓑ 호출되어 초기화됩니다. 
        this.j=j;
    } 
} 

public class ThisExam_11 { 
    public static void main(String[] args) { 
        ThisData od = new ThisData(100, 90); 
         
        System.out.println("od.i: " + od.i); 
        System.out.println("od.j: " + od.j); 
        System.out.println("od.k: " + od.k);         
    } 
} 

---------------------------------------------------

super 생성자는 그냥 씀

package day09;

class OverC{
int i;
int j;
public OverC(int i, int j){
this.i = i;
this.j = j;
}
public OverC(){
System.out.println("OverC의 기본 생성자");
}
void show(){
System.out.println("상위 클래스의 메소드 show() 수행");
}
}



class SubOverC extends OverC{
int k;
public SubOverC(int i, int j, int k){
super(i,j);
this.k = k;
}
void show(){
System.out.println("하위 클래스의 메소드 show() 수행");
System.out.println("==super를 이용한 상위 클래스 메소드 호출==");
super.show();
}
}

public class SuperExam_12 {
public static void main(String[] args) {
SubOverC over1 = new SubOverC(10,20,30);
System.out.println("i,j,k의 값: " + over1.i + " " + over1.j + " " + over1.k);
//이건 그냥 10 20 30 출력될건데 
//출력되는 과정에서 super(i,j)해서 부모 생성자 호출함
over1.show();//하위 + 상위 출력
}
}

-------------------------------------------------------------------------------

Abstract Class (추상 클래스)

Abstract Method (추상 메소드)

- 기능이 구현되지 않고 원형만 선언되어 있는 메소드인데
이거는 {} 안써도됨

추상 메소드가 있으면 추상 클래스

그냥 선언을
abstract public void draw();
이런 식으로 만들어놓고 자식 클래스에서 오버라이딩함! :D

오버라이딩 안하면 껍데기여서 무쓸모인것
심지어 오버라이딩 안하면 안 한 서브클래스도 추상메소드 취급당해서 못씀 ㅋㅋㅋㅋ

추상 메소드가 1개라도 있으면 추상 클래스!
근데 추상 클래스 
abstract class Line{} <- 이렇게 만들고 추상 메소드 없어도 추상 클래스

그리고 얘는 객체를 생성할 수 없기 때문에
서브 클래스 필수쉰것

----------------------------------------------------------

package day09;

abstract class Calculator {
public abstract int add(int a, int b);

public abstract int subtract(int a, int b);

public abstract double average(int[] a);

}

public class GoodCalc extends Calculator {

@Override
public int add(int a, int b) {
return a + b;
}

@Override
public int subtract(int a, int b) {
// TODO Auto-generated method stub
return a - b;
}

@Override
public double average(int[] a) {
double sum = 0;
double avg = 0;

for (int i = 0; i < a.length; i++) {
sum += a[i];
}

avg = sum / a.length;

return avg;
}

public static void main(String[] args) {
GoodCalc david = new GoodCalc();
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

System.out.println("합  : " + david.add(10, 20));
System.out.println("차  : " + david.subtract(20, 10));
System.out.println("평균: " + david.average(arr));

}

}
이 상태인데 

GoodCalc 입력받고 출력받는 메소드 만들기

package day09;

import java.text.DecimalFormat;
import java.util.Scanner;

abstract class Calculator {

public abstract int add();
// 합

public abstract int subtract();
// 차

public abstract double average();
// 배열의 평균값

public abstract void inputValue();
// 값 삽입

public abstract void printValue();
// 값 출력

}

public class GoodCalc extends Calculator {

int a;
int b;
int arrnum = 0;
int arr[] = new int[2];

@Override
public int add() {

return a + b;
}

@Override
public int subtract() {
return a - b;
}

@Override
public double average() {
String avgSample = "";
double avg = 0;
DecimalFormat d = new DecimalFormat(".##");

avgSample = d.format((double) arr[0] / arr[1]);
avg = Double.parseDouble(avgSample);
return avg;
}

@Override
public void inputValue() {
Scanner s = new Scanner(System.in);
System.out.println("첫번째 숫자를 입력해 주세요.");
a = s.nextInt();
System.out.println("두번째 숫자를 입력해 주세요.");
b = s.nextInt();

System.out.println("배열에 입력하실 숫자의 개수를 입력해 주세요.");
arrnum = s.nextInt();

int arr[] = new int[arrnum];

for (int i = 0; i < arrnum; i++) {
System.out.println("배열의" + (i + 1) + "번째 숫자를 입력해 주세요.");
arr[i] = s.nextInt();

if (i == arrnum - 1) {
System.out.println("배열에 입력이 완료되었습니다.\n");
}
} // end for

for (int i = 0; i < arrnum; i++) {
this.arr[0] += arr[i];
} // end for

this.arr[1] = arrnum;

System.out.println("숫자 입력이 완료되었습니다.\n");
}

@Override
public void printValue() {
System.out.println("합  : " + add());
System.out.println("차  : " + subtract());
System.out.println("평균: " + average());
}

public static void main(String[] args) {
GoodCalc david = new GoodCalc();

david.inputValue();
david.printValue();

}

}

------------------------------출력은 되는데 처음 선생님이 준 메소드로 다시 변환해보기------
package day09;

import java.text.DecimalFormat;
import java.util.Scanner;

abstract class Calculator {

public abstract int add(int a, int b);
// 합

public abstract int subtract(int a, int b);
// 차

public abstract double average(int[] a);
// 배열의 평균값

public abstract void inputValue();
// 값 삽입

public abstract void printValue();
// 값 출력

}

public class GoodCalc extends Calculator {

private int a;
private int b;
private int arrnum = 0;
private int arr[] = new int[2];

public int getA() {
return a;
}

public void setA(int a) {
this.a = a;
}

public int getB() {
return b;
}

public void setB(int b) {
this.b = b;
}

public int getArrnum() {
return arrnum;
}

public void setArrnum(int arrnum) {
this.arrnum = arrnum;
}

public int[] getArr() {
return arr;
}

public void setArr(int[] arr) {
this.arr = arr;
}

@Override
public int add(int a, int b) {

return a + b;
}

@Override
public int subtract(int a, int b) {
return a - b;
}

@Override
public double average(int[] a) {
String avgSample = "";
double avg = 0;
DecimalFormat d = new DecimalFormat(".##");

avgSample = d.format((double) arr[0] / arr[1]);
avg = Double.parseDouble(avgSample);
return avg;
}

@Override
public void inputValue() {
Scanner s = new Scanner(System.in);
System.out.println("첫번째 숫자를 입력해 주세요.");
a = s.nextInt();
System.out.println("두번째 숫자를 입력해 주세요.");
b = s.nextInt();

System.out.println("배열에 입력하실 숫자의 개수를 입력해 주세요.");
arrnum = s.nextInt();

int arr[] = new int[arrnum];

for (int i = 0; i < arrnum; i++) {
System.out.println("배열의 " + (i + 1) + "번째 숫자를 입력해 주세요.");
arr[i] = s.nextInt();

if (i == arrnum - 1) {
System.out.println("배열에 입력이 완료되었습니다.\n");
}
} // end for

for (int i = 0; i < arrnum; i++) {
this.arr[0] += arr[i];
} // end for

this.arr[1] = arrnum;

System.out.println("숫자 입력이 완료되었습니다.\n");
}

@Override
public void printValue() {
System.out.println("합  : " + add(a, b));
System.out.println("차  : " + subtract(a, b));
System.out.println("평균: " + average(arr));
System.out.println("숫자 출력이 완료되었습니다.");
}

public static void main(String[] args) {
GoodCalc david = new GoodCalc();

david.inputValue();
david.printValue();

}

}


------------------------------------이렇게 하면 되지만 메소드 그대로 안 짜도 될 거 같음 - 어짜피 연습인것...

----------밥먹었음!!! ---------------------------

Final 클래스
String 같은 건

public final class String extends Object implements Serializable, Comparable, CharSequence 


public class FinalTest extends String{  //ERROR 

} 

요렇게 생겨서 extends 못함 ㅠㅠ = 상속 = 확장 불가 :<

상수 선언! : 다시 읽어보기! :D

--------------------------------------------
[18] 인터페이스

Interface는 상수와 추상 메소드로만 이루어져 있음! - 메소드도 {} 없음
모든 추상메소드에 public이랑 abstract가 들어간거라 안 써도 된당! :>

추상메소드는 앞으로 추가되거나 구현되는 기능의 설계역할! - 실제 기능 구현 x 메소드 원형만 구현 o!

외부에 공개한 메소드를 등록하는 목적 - 인터페이스를 통하면 안 보여주고 싶은 메소드 숨김 가능!

클래스 - 인터페이스 - 클래스 연결하는 것

인터페이스를 구현한 클래스는 추상 메소드 전부 구현 필요! - 한개라도 안 하면 추상클래스됨
인터페이스는 객체 생성 불가능


ㅇㅇ 생략 가능


package day09;

interface Inter{
public abstract int add(int i, int j);
//저거 이거랑 똑같음 int add(int i, int j);
public int sub(int i, int j);
//abstract 생략
}

public class InterImpl implements Inter{

@Override
public int add(int i, int j) {
return i+j;
}

@Override
public int sub(int i, int j) {
return i-j;
}
public static void main(String[] args) {
InterImpl interImpl = new InterImpl();
System.out.println(interImpl.add(10, 5));
System.out.println(interImpl.sub(10, 5));
//인터페이스는 기능이 구현되어 있지 않음으로
//객체 생성 불가능
//Inter inter = new Inter();
//인터페이스는 구현 클래스를 할당 받을수 있음
//인터페이스 = 구현페이스 <- 형식으로
Inter inter2 = new InterImpl();
System.out.println(inter2.add(100, 50));
System.out.println(inter2.sub(100, 50));
Inter inter3;
inter3 = new InterImpl();
//위에거랑 같은건데 그냥 두줄로 쓰고 싶어서
System.out.println(inter3.add(1000, 500));
System.out.println(inter3.sub(1000, 500));
 
}

}

이런 식으로 쓰면 됨
2. 인터페이스의 참조 

   - 각 클래스의 멤버 변수에 접근하는 경우는 그 클래스 타입으로 형변환을 
     해 주어야 합니다. 
   - 인터페이스 타입  객체 = new 인터페이스 구현 클래스  

어 이거할때 딴생각함ㅠㅠ

package day09;

interface B101 {
void display(String s);
}

class D101 implements B101 {
String str = "";

public void display(String s) {
str = s;
System.out.println("★☆★☆★☆★☆★☆" + s);
}
}

class D102 implements B101 {
String str = "";

public void display(String s) {
str = s;
System.out.println("☆★☆★☆★☆★☆★" + s);
}
}

public class IR2 {
public static void main(String[] args) {
B101 b = new D101();
//클래스 D101의 객체를 생성해서 b에 할당
//어 그러니까 업캐스팅:D!
b.display("석모도 - 보문사 - 벤댕이 회무침");

b = new D102();
b.display("대부도 - 방아머리 - 바지락 칼국수");

//인터페이스 타입은 구현 클래스의
//변수에 접근할 수 없습니다.
//System.out.println(b.str);
//구현 객체의 멤버변수에 접근하려면
//인터페이스의 구현 클래스 타입으로
//형변환을 합니다
D102 d2 = (D102) b;
//다운캐스팅! :>
System.out.println(d2.str);

}
}



오 근데 인터페이스는 여러개 implements 할 수 있음 :>
= 여러개 상속! :0!

package day09;

interface Green{
public String greenColor();
}

class GreenImpl implements Green{
public String greenColor(){
return "초록색입니다.★";
}
}

interface Red{
public String redColor();
}

class RedImpl implements Red{
public String redColor(){
return "빨간색입니다.★";
}
}

class ColorImpl implements Green, Red{
public String greenColor(){
return "★초록색입니다.";
}
public String redColor(){
return "★빨간색입니다.";
}
} //요렇게 인터페이스는 >>,<<로 다중 implements 가능! :>
//이럴 경우에는 얘네가 가지고 있는 추상 메소드
//모두 다 구형해줘야함! :>


public class ColorMain {
public static void main(String[] args) {
Green g = new GreenImpl();
System.out.println(g.greenColor());
Red r = new RedImpl();
System.out.println(r.redColor());
ColorImpl c = new ColorImpl();
System.out.println(c.greenColor());
System.out.println(c.redColor());
}
}
=======================잠깐잘래------------------------
------------------------쉬었음==========================

package day09;

interface MyinfoInter{
public String getName();
public String getPhone();
}

class Myinfo implements MyinfoInter{
private String name;
private String phone;
private String address;
private int age;
Myinfo(){}
Myinfo(String name, String phone, String address, int age){
this.name = name;
this.phone = phone;
this.address = address;
this.age = age;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return name;
}
public void setName(String name){
this.name = name;
}
@Override
public String getPhone() {
// TODO Auto-generated method stub
return phone;
}
public void setPhone(String phone){
this.phone = phone;
}
public String getAddress(){
return address;
}
public void setAddress(String address){
this.address = address;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}


public class MyinfoUse {
public static void main(String[] args) {
MyinfoInter info = new Myinfo("길동","0101010101","인천시 남동구", 35);
System.out.println("이름: " + info.getName());
System.out.println("전화: " + info.getPhone());
System.out.println("주소: " + info.getAddress());
System.out.println("나이: " + info.getAge());
}
}

----------------------------------이건 에러 뜬다!

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
The method getAddress() is undefined for the type MyinfoInter
The method getAge() is undefined for the type MyinfoInter

at day09.MyinfoUse.main(MyinfoUse.java:67)

----------------------------------------이런 에러!
이유는 업캐스팅 했는데 얘는 모르는 메소드라서 그럼 :<

이거 StarUml로 그려볼거임


얘 타입 바꾸는 법



이렇게 바뀜



이거는 인터페이스 구현해줬다는 뜻...




위에 소스 uml로 구현해본것...


CLASS 부분 10번 보기! :D


ㅇㅇ 이렇게 클래스가 끝났음다

재밌당 ^^... 우리의친구 같은것




자바 - 예외처리! - Exception 


예외는 운영중에 발생하는 에러! :D
코딩중에 발생하는 에러가 아니라 컴파일시 에러인것 ... - 이걸 실행하기 전에 잡아야함 넘나재미있는것... -.,-)

예외 때문에 다른애들 죽지 말라고 얘 이상해도 다른애 잘 돌아갈 수 있게 하는 것 <--


finally는 예외가 나든지 말든지 무조건 실행해야 하는 것.


요렇게.


ArrayIndexOutOfBoundsException - a[9] 만들어놓고 a[10] 접근하면 생김
StringIndexOutOfException도 있음 - 
홍 길 동  안 녕 하세 요
0 1  2  3  4  5  6  7  8   -인데 10에 접근하려고 하면 스트링 인덱스 아웃오브 익셉션

NumberFormatException - Integer.ParseInt같은 데서 잘못된 타입 받으면 이런거 뜸

근데 넘 많으니까 여기 위에 거 정도만 외워두기...

try{
개발자가 에러가 발생할 소지가 있는 코드를 선별해서 지정해야 한다.   
}catch(Exception e){
예외처리 및 예외처리 원인 출력
}
finally{
무조건 실행되는 코드 블럭, 데이터베이스 연결 종료 등
}

--------------------------코드--------------------

package day09;

public class Ex1 {
public static void main(String[] args) {
int a = 10;
int b = 0;
// if(b==0){
// System.out.println("0으로 나눌 수 없습니다.");
// System.exit(0);
// }
System.out.println("a = " + a + " b = " + b);
System.out.println("a/b = " + (a/b));
System.out.println("나눗셈이 수행되었습니다.");
}
}

a = 10 b = 0Exception in thread "main" 
java.lang.ArithmeticException: / by zero
at day09.Ex1.main(Ex1.java:14)

------------------------------------------------arithmeticException 뜸

package day09;

public class Ex1 {
public static void main(String[] args) {
int a = 10;
int b = 0;

// if(b==0){
// System.out.println("0으로 나눌 수 없습니다.");
// System.exit(0);
// }
try {// 에러가 발생될 소지가 있는 곳
System.out.println("a = " + a + " b = " + b);
System.out.println("a/b = " + (a / b));
System.out.println("나눗셈이 수행되었습니다.");
} catch (Exception e) {// 예외처리 및 예외처리 원인 출력
e.printStackTrace();// 이러면 원인 출력됨
} finally {// 무조건 나오는 곳
System.out.println("정리코드 입니다.");
}

System.out.println("프로그램이 정상적으로 끝납니다.");

}
}

요렇게 트라이캐치문으로 묶어주면

a = 10 b = 0
정리코드 입니다.
프로그램이 정상적으로 끝납니다.
java.lang.ArithmeticException: / by zero
at day09.Ex1.main(Ex1.java:14)

끝나기는 정상적으로 끝남 :>
------------------------------------------------------
package day09;

public class Ex2 {
public static void main(String[] args) {
String str = null;
char s = str.charAt(5); //5번째 해당하는 인덱스값을 가짐
System.out.println("s:" + s);
System.out.println("프로그램 실행을 끝냅니다.");
}
}

이러면 널 포인터 익셉션

Exception in thread "main" java.lang.NullPointerException
at day09.Ex2.main(Ex2.java:6)

------------------------------------------------------------

package day09;

public class Ex2 {
public static void main(String[] args) {
String str = "홍길동";
try{
char s = str.charAt(5); //5번째 해당하는 인덱스값을 가짐
System.out.println("s:" + s);

}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("프로그램 실행을 끝냅니다.");
}
}
}

요러면

java.lang.StringIndexOutOfBoundsException: String index out of range: 5
at java.lang.String.charAt(String.java:658)
at day09.Ex2.main(Ex2.java:9)
프로그램 실행을 끝냅니다.

---------------------------------ㅋㅋㅋ스트링인덱스아웃오브바운즈익셉션

예외 선언은 첨에는 좁은 범위 -> 담에는 넓은 범위 예외를 명시함

java.lang.Object     
  | 
  +--java.lang.Throwable 
        | 
        +--java.lang.Exception                                 <--- 가장 넓은 범위 
              | 
              +--java.lang.RuntimeException 
                    | 
                    +--java.lang.IllegalArgumentException 
                          | 
                          +--java.lang.NumberFormatException   <--- 가장 좁은 범위, 여기부터 catch문에 명시 

사실 잘 모르면 그냥 Exception으로 받고 생각해야지 :>
>>>>> ExceptionError1.java 
class ExceptionError1 { 
  public static void main(String args[]) { 
  
   try { 
      System.out.println("매개변수로 받은 두 개의 값"); 
      int a = Integer.parseInt(args[0]);    // 문자열 값을 정수로 변환 
      int b = Integer.parseInt(args[1]); 
      System.out.println(" a = " + a + " b = " + b ); 
      System.out.println(" a를 b로 나눈 몫 = " + (a/b) ); 
      System.out.println("나눗셈이 원할히 수행되었습니다."); 
    } 
    catch(ArithmeticException e) { 
      System.out.println("=================================="); 
      System.out.println("ArithmeticException 처리 루틴 : "); 
      System.out.println(e + " 예외 발생"); 
    } 
    catch(ArrayIndexOutOfBoundsException e) { 
      System.out.println("=================================="); 
      System.out.println("ArrayIndexOutOfBoundsException 처리 루틴"); 
      System.out.println(e + " 예외 발생"); 
    } 
    catch(NumberFormatException e) { 
      System.out.println("=================================="); 
      System.out.println("NumberFormatException 처리 루틴"); 
      System.out.println(e + " 예외 발생"); 
    } 
    catch(Exception e) { 
        System.out.println("=================================="); 
        System.out.println("알수없는 문제가 발생했습니다."); 
        System.out.println(e.toString());         
    } 
    finally { 
      System.out.println("=================================="); 
      System.out.println("예외 처리를 끝내고 finally 블럭을 수행합니다"); 
    } 
    System.out.println("나머지 모듈 정상 작동!!!"); 
  } 
} 

이거 파워 복붙인데 뭔가 오류남 :< 재부팅!

사실 요즘 세상이 좋아져서 이클립스가 try catch 다 알려줌 ㅋㅋㅋㅋ


와 혼란스럽다 :D



   - 메소드에 throws절을 명시하면 try~catch문을 사용하지 않아도 됩니다. 


이걸
package day09;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Ex3 {
public static void main(String[] args) {
Connection con = null;
try {
con = DriverManager.getConnection("", "", "");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(con != null){
con.close();
}
}
}
}

이걸 그냥 쓰긴 헀음 ... - 어려움../



5. 수업

진도: 

hw: 


6. 할것


업캐스팅 예제 풀어보기.

업캐스팅 다운캐스팅 용도를 찾아보기

abstract 메소드로 BMO 연구하기


클래스 관련 모르는 것 체크해보기

페로봇 인터페이스로 짜보기


영어공부도 같이 하기! - 아 이번 토익 봐야함 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 4월에 끝남...


으아아 정보처리기사도봄

그리고 토익도봄

그리고 ocjp도봄


다봄


봄봄봄봄이왔네요


Exception 들어간 Calc 만들어보기 

foreach - 는 배열이랑 컬렉션은 가능... - 인데 나중에 배운댕 :>


그래도 일괄처리하는 배열에 쓰면 편하니까!

'Programming' 카테고리의 다른 글

160328: 11회차  (5) 2016.03.28
160325: 10회차  (0) 2016.03.25
160323: 8회차  (1) 2016.03.23
160322: 7회차  (4) 2016.03.22
160321: 6회차  (1) 2016.03.21
Posted by DAVID

160323: 8회차

Programming 2016. 3. 23. 11:27

종료하기 전 티스토리 네이버 로그아웃 할 것

가끔 저장 해놓기.


1. 툴

동일

추가시: staruml 5.0


staruml-5.0-with-cm.vol1.egg

staruml-5.0-with-cm.vol2.egg

staruml-5.0-with-cm.vol3.egg



2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시: \\172.16.3.249 


4. 공부하는 것


오늘부터 상속!

: 부모가 자식한테 물려주는 것


부모(상위 클래스)의 특성(필드,메소드)를 자식(하위 클래스)에게 물려주는 것

superclass                             subclass

basicclass                            

기본 클래스                            확장 클래스

특성을 물려주는 상위 클래스             특성을 물려받는 하위 클래스


부모의 특성을 재정의할 필요가 없어서 정의가 간결해짐 


이거는 멤버 변수보다는 메소드를 상속하려고 쓰는 건데

부모 클래스 기능 확장할 때 얘를 직접 수정하지 않고 자식이 기능을 확장해서 씀 (메소드 추가!)

- 만약에 부모가 + 랑 - 기능 있으면 - 자식이 %랑 *랑 / 기능 만들면 부모가 주는 +랑 - 기능을 안 써놔도 쓰기 가능


기능이란 건 메소드란 뜻


구래서 기본 + 메소드 확장해서 쓰니까 자식클래스가 확장클래스


상속을 계속계속 하게 될 경우에는 기능이 짱 많아짐.

근데 a(부모) -> b(자식) 인 경우에 c(부모) -> b(자식) 이렇게 여러 클래스를 상속하지는 못함 

(자바에서는 못함... c++에서는 가능이긴 한데 복잡한것)


상속을 안 쓰면 같은 기능을 쓰는 클래스가 여러개인데 상속 받으면 편함



이런 식으로 부모1 -> 부모2(부모1의 자식) -> 자식(부모2의 자식) 가능


상속 쓰는 법은


public class a{

} //맨 처음 부모 클래스

public class b extends a{

//a를 상속받는 클래스 b인것

}

public class c extends b{

//b를 상속받는 클래스 c인것

}


이렇게 쓰는 예시

package day08;


class Movie{

String prat = "영화";

}


class KorMovie extends Movie{

String m1 = "가문의 위기";

}


class ForMovie extends Movie{

String m1 = "박물관이 살아있다.";

}



public class MovieTest {

public static void main(String[] args) {

KorMovie k = new KorMovie();

System.out.println("장르: " + k.prat);

System.out.println("제목: " + k.m1);

ForMovie f = new ForMovie();

System.out.println("장르: " + f.prat);

System.out.println("제목: " + f.m1);

}

}


이런 식으로 부모 클래스의 변수를 선언 안 해도 쓸 수 있음
KorMovie/ForMovie의 prat


package day08;


class Movie{

String prat = "영화";

}


class KorMovie extends Movie{

String m1 = "가문의 위기";

}


class KorMovie2 extends KorMovie{

String m1 = "가문의 위기2";

}


class ForMovie extends Movie{

String m1 = "박물관이 살아있다.";

}



public class MovieTest {

public static void main(String[] args) {

KorMovie k = new KorMovie();

System.out.println("장르: " + k.prat);

System.out.println("제목: " + k.m1);

KorMovie2 k2 = new KorMovie2();

System.out.println("장르: " + k2.prat);

System.out.println("제목: " + k2.m1);

ForMovie f = new ForMovie();

System.out.println("장르: " + f.prat);

System.out.println("제목: " + f.m1);

}

}


요런 식으로 


Movie -> KorMovie -> KorMovie2 인 경우에도 멤버변수 잘 쓸 수 있음



<<메모리친구>>

KorMovie k 생성시 Movie객체(그 전에 Object)를 먼저 만듬 - k.m1은 이 Movie객체도 접근 가능

- 항상 부모 영역 부터 만들고 쓰는 거라 상속 많이 쓰면 메모리 많이 먹음...

- Object 같은 거 쓰는 건 .hashCode() 이런 거 출력할 때 쓰는거임


사실 상속 쓸 때 무조건 private 멤버함수를 쓰니까 setter랑 getter 필수


//메소드 상속 


package day08;


class Car {

public void gear() {

System.out.println("수동 기어를 사용합니다.");

}

}


class ChildCar extends Car {

public void auto_gear() {

System.out.println("자동 기어를 사용합니다.");

}

}


class ChildCar2 extends ChildCar {

// public void gear(){

// System.out.println("수동 기어를 사용하지 않습니다.");

// }

public void auto_gear2() {

System.out.println("수동/자동 기어를 혼합하여 사용합니다.");

}


}


public class CarTest {

public static void main(String[] args) {

ChildCar2 cc2 = new ChildCar2();

cc2.gear();

cc2.auto_gear();

cc2.auto_gear2();

}

}

출력하면 부모 클래스에서 선언해놓은 메소드대로 잘 나옴.

class Car {
public void gear() {
System.out.println("수동 기어를 사용합니다.");
}
}
이거는 사실

class Car extends java.lang.Object{
public void gear() {
System.out.println("수동 기어를 사용합니다.");
}
}
이거랑 같은 말인데
Object는 모든 클래스가 부모로 가지고 있는 애라서 생략 가능 

cc2를 만들면
object - car - childcar - childcar2 영역이 만들어짐

그래도 해시코드는 childcar2 거만 cc2가 가지고 있는것 



이렇게 보면 Object 상속받은 거 볼 수 있음.


그러니까 Object가 java.lang 패키지 내의 최상위 클래스인데 




이런 클래스 구조도를 가지고 있음

출처: http://hyeonstorage.tistory.com/178


사용자가 클래스를 정의할 떄 extends java.lang.Object 를 안 도 자동으로 상속받게 되어

Object 클래스의 모든 메소드와 변수를 사용자가 만드는 모든 클래스에서 사용 가능하다.


---------------------------------------------------------------------------------

starUML 써보는 것


Empty project -> 모듈 익스플로러에 있는 거 f2 누르면 이름 변경 가능 -> package 상속 생성

상속 -> add Diagram -> class Diagram


Annotation 에서 더블클릭 해서 클래스 생성 후 Select(화살표 모양) - 하면 선택 가능


클래스에서 선택해서 Add attribute랑 Add operation 할 수 있음 (멤버랑 메소드)



-prat: string  = 이거는 private 타입 String 변수임

String 안하고 starUML에서는 소문자 string


이걸 상속으로 만드려면

Generalization (상속) 누르고 그냥 부모한테 연결해 주면 됨


메인은 

+main(args :string[]): void = +는 public 타입 

그리고 static 변경법은 

model Explorer 에서 - 밑에 properties 보면 detail에 OwnerScope를 CLASSIFIER로 변경해 주면 static으로 바뀐다.


Association - 양방향 이용 가능

DirectedAssociation - 한방향만 이용중인 것 




<- 같이 생긴 건  : DirectedAssociation

◁- 같이 생긴 건 : Generalization


접근하는 건 위로만 올라감 (반대로 내려오면 안된다.)



CarTest.java는 이렇게.


-----------------------3교시---------------------


package day08;


class A {

public int p;

private int n;


public void setN(int n) {

this.n = n;

}


public int getN() {

return n;

}

}


class B extends A {

private int m;


public void setM(int m) {

this.m = m;

}


public int getM() {

return m;

}


public String toString() {

String s = getN() + " " + getM();

return s;

}


}


public class Main {

public static void main(String[] args) {

A a = new A();

a.setN(0);

System.out.println(a.getN());


B b = new B();

b.setN(1);

b.setM(2);

System.out.println(b.toString());

}

}


항상 class 만들어지면 object class 를 상속받는 것

- protected 는 같은 패키지면 접속 가능

package day08;

class A2{
int i;
public int pub;
protected int pro;
private int pri;

}

public class B2 extends A2{
void set(){
i = 4;
pub = 3;
pro = 2;
pri = 1;
}
void printout(){
System.out.println("i   :" + i);
System.out.println("pub :" + pub);
System.out.println("pro :" + pro);
System.out.println("pri :" + pri);
}
public static void main(String[] args) {
B2 b = new B2();
b.set();
}
}

이거는 private를 setter getter를 안 만들어서 오류나니까
package day08;

class A2{
int i;
public int pub;
protected int pro;
private int pri;
public void setPri(int pri){
this.pri = pri;
}
public int getPri(){
return pri;
}
}

public class B2 extends A2{
void set(){
i = 4;
pub = 3;
pro = 2;
setPri(1);
}
void printOut(){
System.out.println("i  : " + i);
System.out.println("pub: " + pub);
System.out.println("pro: " + pro);
System.out.println("pri: " + getPri());
}
public static void main(String[] args) {
B2 b = new B2();
b.set();
b.printOut();
}
}


요렇게 하면 출력 가능
어쨌든 protected는 같은 패키지 내에서 공유 가능이긴 한데 잘 안 쓸 거 같다...
그리고 default인 friendly는 그냥 안쓰는거보고 부르는 것... -.-) 굳이 friendly 라고 쓰면 오류남

이거 갑자기 궁금해서 써봄
try {
System.in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.in.close(); 한 다음에 try catch문 넣어줘야 함.


------------다른 패키지의 상속관계--------------------


package pb;


import pa.A3;


//package pa;

//

//public class A3 {

// int i;

// public int pub;

//

// protected int pro;

// private int pri;

//}



public class B3 extends A3{

void set(){

// i = 1; //default 멤버는 접근 불가능

pro = 2;

// pri = 3;//private 멤버도 접근 불가능

pub = 4;

}

void printSet(){

// System.out.println("i   : " + i);

System.out.println("pro : " + pro);

// System.out.println("pri : " + pri);

System.out.println("pub : " + pub);

}

public static void main (String args []){

B3 b = new B3();

b.set();

b.printSet();

}

}


패키지가 다른 클래스를 가져올 경우에 import pa.A3; 해줘야 상속 가능하다.

----------------------------------------------------------------------------------------- 
접근 제한자   같은 클래스    같은 패키지    상속관계의 다른 패키지    관련없는 다른 패키지 
                             (같은 폴더)        (폴더 상관없음)          (다른 폴더)   
------------ ----------------------------------------------------------------------------- 
private          ○               X                 X                       X  (중요) 
----------------------------------------------------------------------------------------- 
friendly         ○               ○                X                       X 
----------------------------------------------------------------------------------------- 
protected        ○               ○                ○                      X   
------------------------------------------------------------------------------------------ 
public           ○               ○                ○                     ○ (중요) 
------------------------------------------------------------------------------------------ 

여기서 보면 protected는 남의 패키지라도 상속중이면 사용이 가능해서 오류나지 않는다.

근데 default = friendly는 상속중이더라도 남의 패키지면 사용이 불가능하다.


그래서 


package pb;


import pa.A3;


/*

 * package pa;


public class A3 {

public int pub;

protected int pro;

private int pri;

public int getPri(){

return pri;

}

public void setPri(int pri){

this.pri = pri;

}

int i;

public int getI(){

return i;

}

public void setI(int i){

this.i = i;

}

}


 * 

 * */


public class B3 extends A3{

void set(){

setI(1); //default 멤버는 접근 불가능

pro = 2;

setPri(3);//private 멤버도 접근 불가능

pub = 4;

}

void printSet(){

System.out.println("i   : " + getI());

System.out.println("pro : " + pro);

System.out.println("pri : " + getPri());

System.out.println("pub : " + pub);

}

public static void main (String args []){

B3 b = new B3();

b.set();

b.printSet();

}

}


이렇게 public으로 접근할 수 있는 setter랑 getter가 필요하다.
근데 남의 패키지에서 가져다 쓰려면 어짜피 세터랑 게터 만들거라서 default 타입 안쓰고 private로 쓴다.
안전하게!


JVM은 

0. 생성자 자동으로 만들어 줌

1. java.lang 패키지는 자동 import  

2. object 클래스는 클래스 자동 상속


//이렇게 하면 출력까지 됨


package pb;


import pa.A3;


/*

 * package pa;


public class A3 {

public int pub;

protected int pro;

private int pri;

public int getPri(){

return pri;

}

public void setPri(int pri){

this.pri = pri;

}

int i;

public int getI(){

return i;

}

public void setI(int i){

this.i = i;

}

}


 * 

 * */


public class B3 extends A3 {

void getValue() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.println("i 값을 입력해주세요.");

setI(s.nextInt()); // default 멤버는 접근 불가능

System.out.println("pro 값을 입력해주세요.");

pro = s.nextInt();

System.out.println("Pri 값을 입력해주세요.");

setPri(s.nextInt());// private 멤버도 접근 불가능

System.out.println("pub 값을 입력해주세요.");

pub = s.nextInt();

}


void printValue() {

System.out.println("i   : " + getI());

System.out.println("pro : " + pro);

System.out.println("pri : " + getPri());

System.out.println("pub : " + pub);

}


public static void main(String args[]) {

B3 b = new B3();

b.getValue();

b.printValue();

}

}


스캐너 import 를 전역으로 하는 게 낫나 아니면 쓸때마다 java.util.Scanner 써주는 게 낫나?
- 아니었음 그냥 고생함 ㅋㅋㅋㅋㅋㅋㅋ
 
-------------------------------------------------------------------------------------

메소드 오버라이딩


-메소드 이름, 메소드 인자 타입 및 개수, 리턴 타입이 다 동일해야함.

-그러니까 부모 클래스의 메소드를 자식이 재정의 하는거임


접근 지정자는 부모 클래스의 메소드의 접근지정자보다 좁아질 수 없다. (?)

출처: http://blog.eairship.kr/119


접근 지정자가 프라이빗 퍼블릭 프로텍티드 디폴트 이런거 있을 때

프로텍티드랑 퍼블릭이랑 디폴트만 접근 가능한데

접근 영역을 줄어들게 만들 수는 없음.


접근 많이 할 수 있는 순서: 퍼블릭>프로텍티드>디폴트


그러니까 부모가 프로텍티드면 자식이 퍼블릭으로는 못 만드는것


static이랑 private이랑 final은 오버라이딩 불가능 // static final이랑 private

//그럼 퍼블릭만 남는 것 아니쉼니까 ? -_-);;


return 타입 다른 경우 오류남!

이거 하면 부모 클래스의 메소드는 무시됨 - 자기가 정의한 걸 가져다 씀 (부모는 은닉됨) = 버전 업 개념


이게 다형성 구현의 핵심 원리인것


메신저 버전업한다고 안메신저 아닌것처럼 기능을 없애닌 게 아니라 기능 교체인것


------------------------코드---------------

package day08;




class OverA{

void show(String str){

System.out.println("상위클래스의 메소드 show(String str) 수행 " + str);

}

}


class SubOverA extends OverA{

void show(){

System.out.println("하위클래스의 메소드 show() 수행");

}

//메소드 인자 타입이 다르니까 오버라이딩 아님

//구냥 상속

//그리고 오버로딩일걸? 아마 값 주면 상위클래스 나옴

//이름이 같은 void 니까 맞음 - 근데 이렇게 해놓고

void show(String str){

System.out.println("나는 오버라이딩: " + str);

}

//이렇게 하면 메소드 이름이랑 인자 타입 및 개수가 같으니까 오버라이딩인것

//오버로딩: 같은 이름의 메소드를 여러개 가지면서

//매개변수의 유형과 개수가 다르도록 하는 기술

//오버라이딩: 상위 클래스가 가지고 있는 메소드를

//하위 클래스가 재정의 해서 사용하는것


//오버로딩은

//*하나의 클래스에서!!!!!!~@!!~!~!~!~!~!~!~!~!~ <- 꺙 'ㅅ'*

//함수명: 같음

//파라미터: 변수 타입 및 개수가 다름

//ㄴ 같은 경우에는 오버로딩이 아닌가?

//리턴 타입: 관계 없음

//사용: 같은 이름으로 함수 정의 

//*하나의 클래스에서!!!!!!~@!!~!~!~!~!~!~!~!~!~ <- 꺙 'ㅅ'*

//오버라이딩은

//*자식 클래스에서!!!!!!~@!!~!~!~!~!~!~!~!~!~ <- 꺙 'ㅅ'*

//함수명: 같음

//파라미터: 같음

//리턴 타입: 같음

//사용: 자식 클래스에서 부모 클래스의 함수 재정의 

//*자식 클래스에서!!!!!!~@!!~!~!~!~!~!~!~!~!~ <- 꺙 'ㅅ'*

}



public class OverrideExam1 {

public static void main(String[] args) {

SubOverA over = new SubOverA();

over.show("IT KOREA");

over.show();

}

}


-------------이제수정------------------

package day08;



//하나의 메소드만 추가하면 오버로딩 + 오버라이딩 되게...


class OverA{

void show(String str){

System.out.println("상위클래스의 메소드 show(String str) 수행 " + str);

}

}


class SubOverA extends OverA{

void show(){

System.out.println("나는 오버로딩  : 입력받는 것 없음");

}

void show(String str){

System.out.println("나는 오버라이딩: " + str);

}

void printShow(){

java.util.Scanner s = new java.util.Scanner(System.in);

show();

System.out.println("↓ 값을 입력하세요!");

show(s.nextLine());

}

}



public class OverrideExam1 {

public static void main(String[] args) {

SubOverA over = new SubOverA();

over.printShow();

}

}


------------------오버로딩이랑 오버라이딩 정리한 것 외울것! ------------------

--------------------------밥먹음맨-----------------------------

다형성 - Polymorphism

한 메소드가 오버라이딩 되면서 서로 다른 내용을 실행하게 되는것

부모의 메소드는 은닉된다! :D

Line a = new Line();
a.draw(); -------
//얘는 자식(Line)의 draw를 호출함
부모는 DObject

/*
다형성: 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미
예를 들어

키보드의 키를 사용하는 법: 누른다
근데 ESC랑 ENTER는 동작이 다름

그러니까 다형성이란 동일한 조작방법으로 동작시키지만 동작방법은 다른 것을 의미한다.

//출처: 구글링했는데 exit 눌러버려서 복사 못 함.

다형성: 여러 가지 형태를 가질 수 있는 능력
-에이씨 이게 제일 쉬움 ㅋㅋㅋㅋ

어쨌든 조상클래스의 메소드로 자손클래스의 메소드를 참조할 수 있도록 한 것

출처: http://arabiannight.tistory.com/entry/302
*/
-------------------------------------------------
부모 클래스 p = new 자식클래스(); <- 이게 업캐스팅인데 
이거 해봤자 자식 클래스한테 오버라이딩으로 메소드를 정의해놨으면 
메소드가 2개중 부모클래스의 메소드는 은닉되는거라서 동적 바인딩이 이루어져 자식클래스의 메소드를 실행한다.

동적바인딩: 부모의 메소드를 호출했지만 자식의 메소드가 실행되는 것

DObject p = new Line();
p.draw(); 
//얘네는 업캐스팅


---이거 수정했음----

package day08;

class Person {
String name;
String phone;
static int ID;

public void setName(String s) {
name = s;
}

public String getPhone() {
return phone;
}

public static int getID() {
return ID;
}

}

public class Professor extends Person {
// protected void setName(String s){ }
//부모의 접근 지정자보다 영역이 좁아졌다.
public void setName(String s) {
name = s;
}// 오버라이딩

public String getPhone() {
return phone;
}// 별 문제 없다.

// public void getPhone(){ }
// 오버라이딩인데 리턴 타입이 다르다.
// 오버라이딩의 조건
// 함수명이 같고(o)
// 파라미터가 같고(x)
// 리턴 타입이 같고(x)

public String getPhone(String s) {
return s;
}// 이러면 오버로딩

// public int getID(){ }
// static인데 오버라이딩 하려 했다.
// static은 오버라이딩 불가능 -> 부모를 static을 빼면 가능
}

----------------------------------------------------------------------------------

객체 형변환

-상속 관계에서는 부모 자식간에 형변환 가능.

-상속 관계에서는 좌측에 부모클래스가 오고 - 우측에 자식클래스가 올 수 있다.

DObject p = new Line(); ---- 부모클래스 p = new 자식클래스();


그래도 실제로 메모리상에는 자식 객체를 생성하고 - 타입만 부모클래스라서 부모만 접근이 가능함 ㅇㅇ

오버라이딩 시에는 부모클래스 타입이더라도 자식클래스의 메소드가 호출됨.


1. 업캐스팅

2. 다운캐스팅이 있음


1. 업캐스팅

- 프로그램에서 이루어지는 자동 변환 타입

-(아까 위에거)

-서브 클래스의 레퍼런스 값을 슈퍼클래스 타입의 변수에 대입함 

class Person{

class Student extends Person{

}

Student s = new Student();

Person p = s; // 이렇게 자식 클래스의 레퍼런스 값을 부모 클래스의 변수에 대입하면 부모만 가리킴

}


-------예시에 super()때문에 공부하고 복붙-------------


package day08;


class Pers{

String name;

String id;

//default

public Pers(String name){

this.name = name;

}//생성자

}


class Stud extends Pers{

//String name;

//String id; //사용가능

String grade;

String department;

public Stud(String name){

super(name);//슈퍼가 뭐람

/*

* 

* http://neoroid.tistory.com/entry/Java-this-this-super-super-%EC%9D%98-%EC%9D%B4%ED%95%B4

* 

* this / this() 하고

* super / super() 하고

* 

* this.grade = "A"; 하면 

* 이 grade는 이 클래스의 멤버인 것을 나타냄

* 

* 근데 this()는 생성자를 호출하기 위해 사용함.

* 

* person jame = new person(23, "david", "america");

* person jame = new person(23, "david");

* 

* 이런 식으로 여러 종류 생성자가 있을 때 그냥

* 편하게 this(23, "david")처럼 입력해도 되나봄...

* 

* 이런 식으로 super();는 

* 현재 자식 클래스가 자신을 생성할 때

* 부모 클래스의 생성자를 불러서 한번 초기화 해주고 난 뒤

* 자신을 초기화하는 것임

* 

* ---요기까지 보다 말아씀 ------

* 

* */

}//생성자

}


public class UpCastingEx {

public static void main(String[] args) {

Pers p;

Stud s = new Stud("길동이");

p = s;

System.out.println(p.name);

// p.grade = "A"; //이거 p에는 없는 변수임

// p.department = "Com";//이것도 p에는 없는 멤버임

}

}


---------------------------------------------------


2. 다운캐스팅

업캐스팅 된 걸 도로 돌리는 거임

부모 클래스 레퍼런스를 자식 클래스 타입의 변수에 넣음


class Person{

}

class Student extends Person{

}

Student s = (Student)p;


----------------------

이런 식으로

public static void main(String[] args) {

Pers p;

Stud s = new Stud("길동이");

p = s;

Stud s2 = (Stud)p;

//s2에다가 p에있는 해시코드를 대입


도로 s->p->s2 

다운 캐스팅 할때는 강제 형변환이 이루어지는것임 .


Stud s3 = new Pers(); //이거는 안됨   

왜냐면 이거는 Pers를 만들 때 Stud가 만들어지지 않으니까 

근데 Stud는 Pers도 만들어지니까 업캐스팅이 가능!


package day08;


class Pers{

String name;

String id;

//default

public Pers(String name){

this.name = name;

}//생성자

}


class Stud extends Pers{

//String name;

//String id; //사용가능

String grade;

String department;

public Stud(String name){

super(name);//슈퍼가 뭐람

/*

* 

* http://neoroid.tistory.com/entry/Java-this-this-super-super-%EC%9D%98-%EC%9D%B4%ED%95%B4

* 

* this / this() 하고

* super / super() 하고

* 

* this.grade = "A"; 하면 

* 이 grade는 이 클래스의 멤버인 것을 나타냄

* 

* 근데 this()는 생성자를 호출하기 위해 사용함.

* 

* person jame = new person(23, "david", "america");

* person jame = new person(23, "david");

* 

* 이런 식으로 여러 종류 생성자가 있을 때 그냥

* 편하게 this(23, "david")처럼 입력해도 되나봄...

* 

* 이런 식으로 super();는 

* 현재 자식 클래스가 자신을 생성할 때

* 부모 클래스의 생성자를 불러서 한번 초기화 해주고 난 뒤

* 자신을 초기화하는 것임

* 

* 부모 없이 자식이 존재하지 않으니까

* Stud를 만들려면 Pers를 만들어야 함

* 

* 만약에 Stud s = new Stud()라고 할 때

* 얘를 만들기 위해서는 

* 얘가 참조하는 Pers부터 만들어야함

* 

* 그러면 Pers의 생성자를 찾아간 뒤

* Stud를 만드는 것인데

* 

* 이럴 때 Pers의 생성자가 없으니까

* 디폴트값으로 public Pers()와 같이

* 생성자를 만듬.

* 

* Stud가 Pers를 상속하니까

* Pers를 만들어야 하는데

* Stud의 생성자에서

* 명시적으로 Pers의 생성자를 적어주지

* 않았으므로 기본값으로 

* super(); 를 부름.

* 

* 이거 뜻은 부모의 pers() (기본 생성자)

* 를 실행하라는 말임.

* 

* 그리고 super는 그냥

* 부모클래스의 필드값이나 메소드를 직접 부를 때 사용

* 

* 만약에 Stud나 Pers 둘 다 모두

* setAge(int) 메소드가 있을 때

* 자식 클래스인 Stud에서

* 부모 클래스인 Pers의 setAge(int); 메소드를

* 부를 일이 생겼을 때는

* 

* setAge(20); 하면

* Stud의 setAge 메소드를 부르게 되고

* 만약에 Stud에 setAge 메소드가 없으면

* Pers(부모 클래스)에 있는지 찾아보게 됨

* 

* 근데 상속된 거 말고 부모의 setAge()를 부르고 싶을 떄는

* super.setAge(); 하면 됨

* 

* 그러니까 super는 

* 나에게 있는 메소드나 필드를 찾지 말고

* 내 부모 클래스에 있는 필드나 메소드를 사용해라.

* 

* --그러니까 상위 클래스를 지칭하는 명령어-

* 

* super.변수; //부모 클래스의 변수를 호출한다.

* super(); //부모 클래스의 생성자를 호출한다.

* super(매개변수); //부모 클래스의 생성자(입력값)을 호출한다.

* super.메소드(); //부모 클래스의 메소드를 호출한다.

* super.메소드(매개변수); //부모 클래스의 메소드(입력값)을 호출한다.

* 

* */

}//생성자

}


public class UpCastingEx {

public static void main(String[] args) {

Pers p;

Stud s = new Stud("길동이");

p = s;

Stud s2 = (Stud)p;

//s2에다가 p에있는 해시코드를 대입

//Stud s3 = new Pers(); //이거는 안됨

//Pers 만든다고 Stud가 만들어지는게 아니니까

System.out.println(p.name);

// p.grade = "A"; //이거 p에는 없는 변수임

// p.department = "Com";//이것도 p에는 없는 멤버임

}

}


-----------------------------------------------------------------------------

내가 다운캐스팅 시스템을 잘 이해하지 못했음

다운캐스팅: 업캐스팅 된 것을 다시 돌리는 것

아! ㅇㅋ



만약에 업캐스팅 안 된 걸 다운캐스팅 하면 어떻게 될까 - 짜보기

어 이거 Person s = new Student ("kim");

이걸로 해 볼 것 




객체 형변환 예제

package day08;


class TypeConvert{

String url = "http://www.kma.go.kr";

public void setUrl(String url){

this.url = url;

}

public String getUrl(){

return this.url;

}

}


public class TypeConvertTest {

public static void main(String[] args) {

TypeConvert tc = new TypeConvert();

Object obj = tc;

//업캐스팅하면

//객체 내에 있는 모든 멤버 접근은 불가능하고

//슈퍼클래스에 있는 멤버만 접근 가능.

//아! 그러니까 업캐스팅 해도 자기한테 있는 멤바만 접근 가능

//오브젝트 클래스의 메소드를 호출함 -_-);;

//System.out.println(obj.getUrl());

//obj 클래스에는 url이라는 스트링이 없음

System.out.println(tc.getUrl());

System.out.println(obj.hashCode());

System.out.println(tc.hashCode());

//아마 같게 나올 듯

//역시 같음

TypeConvert tc2 = (TypeConvert)obj;

System.out.println("tc2: " + tc2.getUrl());

System.out.println("tc2: " + tc2.hashCode());

}

}



----------------------------

동적바인딩 - 오버라이딩 + 업캐스팅 한 경우에 부모 객체에서 메소드 호출해도 자식 객체에 오버라이딩 된 메소드가 출력되는 것


source -> override / Implements Methods 해서 부모 것 오버라이딩 할 수 있는 메소드 생성 가능


그러면 toString을 

package day08;


class TypeConvert{

String url = "http://www.kma.go.kr";

public void setUrl(String url){

this.url = url;

}

public String getUrl(){

return this.url;

}


@Override

public String toString() {

// TODO Auto-generated method stub

return "TypeConvert의 Override된 toString()";

}

}


public class TypeConvertTest {

public static void main(String[] args) {

TypeConvert tc = new TypeConvert();

Object obj = tc;

//업캐스팅하면

//객체 내에 있는 모든 멤버 접근은 불가능하고

//슈퍼클래스에 있는 멤버만 접근 가능.

//아! 그러니까 업캐스팅 해도 자기한테 있는 멤바만 접근 가능

//오브젝트 클래스의 메소드를 호출함 -_-);;

//System.out.println(obj.getUrl());

//obj 클래스에는 url이라는 스트링이 없음

System.out.println(tc.getUrl());

System.out.println(obj.hashCode());

System.out.println(obj.toString());

System.out.println(tc.hashCode());

//아마 같게 나올 듯

//역시 같음

TypeConvert tc2 = (TypeConvert)obj;

System.out.println("tc2: " + tc2.getUrl());

System.out.println("tc2: " + tc2.hashCode());

}

}


부모를 가리키는 해시코드값을 가지고 있어도 자식의 메소드를 출력함
이유: 호출할라 그랬더니 없어서 -> 찾으니까 -> 자식한테옴

이게 동적바인딩


상속 머리가 아프닼ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

package day08;
//수당 주는 기능까지 추가되는 걸 상속으로 만듭시다 :D

//allowance

class Pay2 {
java.util.Scanner s = new java.util.Scanner(System.in);

private String name;
private int bonbong;

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setBonbong(int bonbong) {
this.bonbong = bonbong;
}

public int getBonbong() {
return bonbong;
}

public Pay2() {

}

public Pay2(String name, int bonbong) {
this.name = name;
this.bonbong = bonbong;
}

public int taxCalc() {

return (int) (bonbong * 0.045 + 0.5);
}

public int silsuCalc() {

return bonbong - taxCalc();
}

public void payPrint() {
System.out.println("이름: " + name);
System.out.println("본봉: " + bonbong);
System.out.println("세금: " + taxCalc());
System.out.println("수령: " + silsuCalc());
System.out.println("");
}

}

class Allowance extends Pay2{
private int year = 5;
private int child = 0;
Allowance(){
}
Allowance(int year, int child, String name, int bonbong){
//부모의 생성자 호출
super(name, bonbong); //이름과 본봉을 받는 생성자가 있으니까 가능
this.year = year;
this.child = child;
}
public void setYear(int year){
this.year = year;
}
public int getYear(){
return year;
}
public void setChild(int child){
this.child = child;
}
public int getChild(){
return child;
}
public int allowanceCalc(){
int allowance = 0;
if(year == 0){
System.out.println("신입사원입니다.");
}
else if(year == 1){
allowance = 200000;
System.out.println("경력 1년입니다.");
}else if(year == 2){
allowance = 400000;
System.out.println("경력 2년입니다.");
}else if(year == 3){
allowance = 600000;
System.out.println("경력 3년입니다.");
}else if(year == 4){
allowance = 800000;
System.out.println("경력 4년입니다.");
}
else{
allowance = 1500000;
}
if(year>=1){
if(child>=1){
allowance = allowance + (child*200000);
}
}
return allowance;
}

@Override
public void payPrint() {
System.out.println("이름: " + getName());
System.out.println("본봉: " + getBonbong());
System.out.println("세금: " + taxCalc());
System.out.println("수령: " + silsuCalc());
System.out.println("");
}


public int silsuCalc() {

return getBonbong() - taxCalc() + allowanceCalc();
}


}

public class PayCalc {

public static void main(String[] args) {
Pay2 p1 = new Pay2();
Pay2 p2 = new Pay2();
Pay2 p3 = new Pay2();
Pay2 p4 = new Pay2("홍길동",3000000);
Allowance p5 = new Allowance(4, 3, "길동이", 3000000);
Allowance p6 = new Allowance();
p6.setBonbong(3500000);
p6.setName("길동삼");
p6.setChild(10);
p6.setYear(5);
p1.setName("왕눈이");
p1.setBonbong(2000000);
p1.payPrint();
p2.setName("아로미");
p2.setBonbong(3000000);
p2.payPrint();
p3.setName("투투");
p3.setBonbong(5000000);
p3.payPrint();
p4.payPrint();
p5.payPrint();
p6.payPrint();
}

}


예전에 했던 예제로 상속 테스트하는 것




Dave's not here man


--------------------이거 넘 스트레스 받아서 소스 받음 -------------


package test.day03;


public class SwitchTest2 {


  public static void main(String[] args) {

    System.out.println("점수         " + "출력내용");

    System.out.println("=================");

    int score = 100 ; 

    int s = (score/10);

    

    switch(s){

    case 10:

      System.out.println("");

      break;

    case 9:

      System.out.println("등급은 A입니다.");

      break;

    case 8:

      System.out.println("등급은 B입니다.");

      break;

    case 7:

      System.out.println("등급은 C입니다.");

      break;

    case 6:

      System.out.println("등급은 D입니다.");

      break;

    default:      

      System.out.println("노력하세요");

      

    }

  }


}



스위치문 넘나 좋은것-------------------------------------

저거 받아서 이거 짰음.

package day08;

class Score {
private String name; // 이름
private int kor; // 국어
private int eng; // 영어
private int mat; // 수학

public Score() {

}

public Score(String name, int kor, int eng, int mat) {
this.name = name;
this.kor = kor;
this.mat = mat;
}

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setKor(int kor) {
this.kor = kor;
}

public int getKor() {
return kor;
}

public void setEng(int eng) {
this.eng = eng;
}

public int getEng() {
return eng;
}

public void setMat(int mat) {
this.mat = mat;
}

public int getMat() {
return mat;
}

public int totalCalc() {
return getKor() + getEng() + getMat();
}

public double avgCalc() {
return totalCalc() / 3;
}

public void printScore() {
System.out.println("이름: " + name);
System.out.println("총점: " + totalCalc());
System.out.println("평균: " + avgCalc());
System.out.println("");
}
}

class ScoreGrade extends Score {

ScoreGrade() {

}

ScoreGrade(String name, int kor, int mat, int eng) {
super(name, kor, mat, eng);
}

public void gradeCalc(int num) {
int s = (num / 10);

switch (s) {
case 10:
System.out.println("");
break;
case 9:
System.out.println("등급: A입니다.");
break;
case 8:
System.out.println("등급: B입니다.");
break;
case 7:
System.out.println("등급: C입니다.");
break;
case 6:
System.out.println("등급: D입니다.");
break;
default:
System.out.println("노력하세요");

}
}

public void printScore() {
System.out.println("이름: " + getName());
System.out.println("총점: " + totalCalc());
System.out.println("평균: " + avgCalc());
gradeCalc((int) (avgCalc()));
System.out.println("");
}
}

public class ScoreCalc {
public static void main(String[] args) {

Score human1 = new Score();
Score human2 = new Score("길동이", 100, 200, 300);
ScoreGrade human3 = new ScoreGrade("길동삼", 50, 60, 70);
ScoreGrade human4 = new ScoreGrade();

human1.setName("길동일");
human1.setKor(100);
human1.setEng(90);
human1.setMat(80);

human4.setName("길동사");
human4.setEng(80);
human4.setMat(100);
human4.setKor(100);

human1.printScore();
human2.printScore();
human3.printScore();
human4.printScore();

}
}

저거 소스 가져다가 스캐너로 입력받을 수 있게 고쳐보는것

아니 오버라이딩은 괜찮은데
업캐스팅 다운캐스팅 스트레스 받는것



5. 수업

진도: 

hw: 


6. 할것


치즐 - 악기 튜닝 가능한 공방

아크릴 물감

'Programming' 카테고리의 다른 글

160325: 10회차  (0) 2016.03.25
160324: 9회차  (2) 2016.03.24
160322: 7회차  (4) 2016.03.22
160321: 6회차  (1) 2016.03.21
160318: 5일차  (2) 2016.03.18
Posted by DAVID

160322: 7회차

Programming 2016. 3. 22. 16:29

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


Setter랑 Getter 쓰는 이유는

http://devist.tistory.com/128

http://dynamide.tistory.com/1384

에서 참조


class 사람{

int 키 = 170;

int 몸무게 = 60; 

}


이라는 클래스를 만들게 될 경우

사람.키와 사람.몸무게로 직접적으로 접근이 가능한데 그러면

아무나 접근을 해서 변경이 가능하기 때문에


클래스의 멤버 필드에는 클래스에서만 접근해서 수정이 가능한 private로 선언을 한다.


그러면

class 사람{

private int 키 = 170;

private int 몸무게 = 60ㅣ

}

이 되는데 이러면 객체에서 키랑 몸무게를 못 바꾸니까

멤버 필드 변수를 변경해주는 기능을 제공해 주는 게 setter와 getter이다.


class 사람{

private int 키 = 170;

private int 몸무게 =60;


public void set 키(int a){

키 = a;

}


public int get키(){

return 키;

}

}


이렇게 하면 get키가 getter고 set키가 setter가 되는데

이러면 키값 변경시


사람 people = new 사람();

people.set키(180);

이런 식으로 객체 값을 변경하고


System.out.println(people.get키());

이런 식으로 객체값을 가져올 수 있다.


이게 좀 불편한데 나중에 프로그램이 커지면 변수에 직접 접근시 오류가 생겼을 경우 발견하기 어려운 걸 방지하기 위해서라고 한다.


그리고 이런 거 이름이 캡슐화.

이거 eclipse에서 Source -> Generate Getters and Setters 하고 변수 체크한 뒤 확인 누르면 만들어지긴 하는데

연습하는 거니까...


그리고 변수명이 name이면

setName 같은 모양으로 만들어주는게 암묵적인 규칙이래...


그리고 한 메소드에 세터 한번에 넣어주는 건 안되는 것 - 따로 쓰라고 쪼개놓은 것...



//잊어버릴까봐: static이 붙은 메소드나 변수는 데이터 영역에 메모리가 할당되는데

이렇게 하면 객체 생성할 필요 없이 클래스를 통해 바로 변수에 접근이 가능하다.


String은 기본형 타입이 아닌데 기본형 같이 생김...

그리고 call by reference임


문자열 타입은 String StringBuffer StringBuilder가 있는데 String만 불변의 특징이 있다.


이게 한번 정한 글자는 바꿀 수가 없는건데

"마우스" -> "마우스다"로 바꾸고 싶으면

그냥 넣어주면 바꾼 것처럼 보이지만


사실 메모리를 새로 잡은거임

그냥 "마우스" +"다" 를 할 수 없고 "마우스" 를 가리키는 해시코드를 "마우스다"를 가리키는 해시코드로 바꿔준거임

그리고 이게 기본형 변수 타입이 아닌 클래스인데도


String name = new String() 이렇게 안 쓰고 String name = "길동이" 이렇게 쓰면 객체화 완료.


그런데 StringBuffer는 StringBuffer sb = new StringBuffer("홍길동") 한 다음에 

StringBuffer sb2 = new StringBuffer("홍길동") 이라고 만들면 sb와 sb2가 서로 다른 해시코드값을 가지는데


String은 String name = "홍길동" 과 String name2 = "홍길동"이 가리키는 해시코드값이 동일하다.

(메모리상으로 하나인 것)


어쨌든 만약에 문자열이 계속 변경되는 프로그램이면 스트링버퍼를 써야지 스트링을 쓰면 메모리 낭비가 심하다.




그리고 문자열 비교할 때는 == 쓰지말고 equals를 쓰자

public static void main(String[] args) {

String n1 = "yes";

String n2 = "yes";

System.out.println(((n1==n2) ? n1 : n2));

}

이게 메모리상으로 String은 해시코드값이 동일해서 yes로 나오긴 하는데 equals를 권장한다니까


public static void main(String[] args) {

String n1 = "yes";

String n2 = "yes"; // String n2 = "nop";

System.out.println((n1.equals(n2) ? n1 : n2));

}

그냥 권장하는 대로 이렇게 쓰자.



그리고 대문자랑 소문자 바꿀 수도 있음

public static void main(String[] args) {

String n1 = "yes";

String n2 = "YES";

System.out.println(n1.toUpperCase());

System.out.println(n2.toLowerCase());

}

이렇게 toUpperCase하고 toLowerCase 메소드 쓰면 됨.


-생성자는 곧 제대로 배울 것 같지만 -

이렇게 생김

class Test{

Test(){

} //얘가 생성자

}


배열 정의할 때

Goods goodsArray[] = new Goods[3];

이거는

Goods goodsArray[];

goodsArray = new Goods[3]; 하고 같음


-----------------------------------------------------

이건 문자열 대체하는 코드


static void replaceSpace(char a[]) {

for (int i = 0; i < a.length; i++) {

if (a[i] == ' ') {

a[i] = ',';

}

}// 공백을 발견하면 ,로 바꿔준다.

}


static void printCharArray(char a[]){

for(int i = 0; i<a.length; i++){

System.out.print(a[i]);

}

System.out.println(); //이건 그냥 출력용

}

public static void main(String[] args) {

char c[] = {'T','h','i','s',' ','i','s',' ','a',' ','p','e','n','c','i','l','.'};

printCharArray(c);

replaceSpace(c);

printCharArray(c);

}



---------------------------------------------------코딩타임이길래 복습하는 것 ------------------------------------------

[12] 메소드 오버로딩 + 생성자


예~ 생성자~~


같은 클래스 내에서 이름이 같은 메소드를 여러 개 만드는 것.

이름이 같아도 인자값으로 받는 개수나 타입이 다르면 다른 메소드로 JVM이 인식하기 때문에 가능한 일


예를 들어 println 같은 것도

System.out.println(1);

System.out.println(1.5);

System.out.println("우리는 한국인");

System.out.println(a);


이렇게 메소드 오버로딩 식으로 선언되어져 있음.


근데 return 타입은 메소드를 구분하는 조건으로 사용 x - 받는 값만 인정


이름이 다르면 메소드 오버로딩이 아님


public void prinnta(int x){}

public void prinnta(float x){}

public void prinnta(String x){}


저런 식으로 만들면 되는데 


PrintStream 클래스 애들이 메소드 오버로딩의 예에 많음


http://docs.oracle.com/javase/8/docs/api/

PrintStream docs에서 보면 out이 printStream 타입 변수로 선언되어져 있다.


println()메소드 및 생성자는 대표적인 메소드 오버로딩.

-그러므로 생성자도 여러 개 만들 수 있는 것


메소드의 인자의 개수나 타입이 달라야 한다.


인자나 개수나 타입이 같고 리턴 타입만 다르면 컴파일 오류


------2교시 코딩해놓고 졸았음 - 메소드 오버로딩-----

어쨌든 이름을 같게 해놓고 파라미터를 다르게 주면 다른 메소드인것


package day07;


public class AvgTest {

public int getAvg(){

System.out.println("값을 2개이상 입력해 주세요.");

return 0;

}

public int getAvg(int a, int b){

return (a+b)/2;

}

public int getAvg(float a, float b){

return ((int)a+(int)b)/2;

}

public int getAvg(int a, int b, int c){

return (a+b+c)/3;

}

public int getAvg(int a, int b, int c , int d){

return (a+b+c+d)/4;

}

// public float getAvg(){

// return 0.0f;

// }


public static void main(String[] args) {

                                       

AvgTest st = new AvgTest();

System.out.println(st.getAvg());

System.out.println(st.getAvg(10,20));

System.out.println(st.getAvg(10.5f,20.5f));

System.out.println(st.getAvg(10,20,30));

System.out.println(st.getAvg(10,20,30,40));

}


}



이런 경우에

// public int getAvg(int a, int b){
// return (a+b)/2;
// }

요렇게 하고

System.out.println(st.getAvg(10,20)); 
이렇게 하면 제일 비슷한 float 2개 들어간 getAvg로 계산함



--------------------------------------

생성자
1. 리턴형이 없음
2. 클래스명과 같아야함( 대소문자 구별함)
3. new를 이용해서 객체 할당 후 초기화함 ★★
4. 생성자를 안 만들어주면 기본생성자를 자동으로 만들어줌 ★★
기본생성자: 매개변수에 아무것도 없는 것 - 그냥 ()만 있는 것


이거 한번 더 보기... - 졸았음

package day07;

class School2{
int kuk = 0;
int eng = 0;
int tot = 0;
public int hap(){
tot = kuk=eng;
return tot;
}
}

public class SchoolMain2 {
public static void main(String[] args) {
School2 sc2 = new School2();
sc2.kuk = 90;
sc2.eng = 100;
System.out.println("hap:" + sc2.hap() );
}
}


생성자를 아예 호출을 안 하면 자동으로 JVM이 만들어줌.

package day07;

class School3 {
int kuk;
int eng;
int tot;

public School3() {

}

public int hap() {
tot = kuk + eng;
return tot;

}

}

public class SchoolMain3 {
public static void main(String[] args) {
School3 sc3 = new School3();
sc3.kuk =90;
sc3.eng = 100;
System.out.println("hap:" + sc3.hap());
}
}

기본 생성자에 파라미터값이 없어도 그냥 만들어놓는 것이 낫다.

package day07;

class School4 {
int kuk;
int eng;
int tot;

public void setKuk(int kuk) {
this.kuk = kuk;
}

public void setEng(int eng) {
this.eng = eng;
}

public void setTot() {
tot = kuk + eng;
}

public int getKuk() {
return kuk;
}

public int getEng() {
return eng;
}

public int getTot() {

return tot;
}

public School4() {
}

public School4(int kuk, int eng) {
this.setKuk(kuk);
this.setEng(eng);
}

}

public class SchoolMain4 {
public static void main(String[] args) {
School4 sc4 = new School4();
sc4.setEng(90);
sc4.setKuk(100);
sc4.setTot();

System.out.println("hap: " + sc4.getTot());

School4 sc = new School4(90, 100);
sc.setTot();

System.out.println("hap2: " + sc.getTot());
}
}00

만약에public School4(int kuk, int eng) {}는 있는데 Schoo4(){}가 없으면 오류가 난다.
그러니까

1. 생성자를 아예 안 만들던가(자동으로 만들어줌)
2. 변수 넣는 생성자를 만들면 기본 생성자(클래스명(){} ) <- 를 꼭 만들어준다.
3. 사실 그냥 안써도 만들어주는게 낫다 <-

--------------------------------------

Static 변수 = 정적 변수 = 클래스 변수 , Static method = 클래스 메소드

- Static을 사용하면 객체를 만들지 않고 변수나 메소드의 사용이 가능하다.
보통 간단한 값의 처리시 주로 이용한다
new를 이용하여 메모리를 할당해서 쓰지만 static 요소들은 클래스가 JVM에 인식될 때 자동으로 메모리가 할당된다.

데이터 영역에 위치해있음.

  public class StaticTest{
         public static int b = 0; <- 최초 1회만 메모리 할당을 받고 모든 객체들이 공유함

         private int a = 0;       <-- 인스턴스 변수
     }    

     public class Test{
          .....
         StaticTest s1 = new StaticTest();
         StaticTest s2 = new StaticTest();
         .....

      }
 

저런 식으로 그냥 만들면 DATA 영역에 만들어진다.

package day07;

class ScjpPass{
int t1;
int t2;
int t3;
int t4;
static int BONUS = 100; //클래식 변수 정적 변수 스태틱 변수
public int getT1() {
return t1;
}

public void setT1(int t1) {
this.t1 = t1;
}

public int getT2() {
return t2;
}

public void setT2(int t2) {
this.t2 = t2;
}

public int getT3() {
return t3;
}

public void setT3(int t3) {
this.t3 = t3;
}

public int getT4() {
return t4;
}

public void setT4(int t4) {
this.t4 = t4;
}

public static int getBONUS() {
return BONUS;
}

public static void setBONUS(int bONUS) {
BONUS = bONUS;
}

public ScjpPass(){
}
public ScjpPass(int t1, int t2, int t3, int t4){
this.t1 = t1;
this.t2 = t2;
this.t3 = t3;
this.t4 = t4;
}
}


public class Scjp {
public static void main(String args []){
System.out.println("스태틱변수: " +ScjpPass.BONUS);
// ScjpPass.BONUS++;
ScjpPass.setBONUS(112);
ScjpPass sp = new ScjpPass(85,90,80,70);
System.out.println("sp.t1: " + sp.t1);
System.out.println("sp.BONUS: " + sp.BONUS);
}
}

----------------------------------

스태틱 메소드는 객체를 만들지 않고도 호출할 수 있다.
package day07;

class SCWCD{

int t1,t2,t3,t4;
static int BONUS = 100;
public int getT1() {
return t1;
}

public void setT1(int t1) {
this.t1 = t1;
}

public int getT2() {
return t2;
}

public void setT2(int t2) {
this.t2 = t2;
}

public int getT3() {
return t3;
}

public void setT3(int t3) {
this.t3 = t3;
}

public int getT4() {
return t4;
}

public void setT4(int t4) {
this.t4 = t4;
}

public static int getBONUS() {
return BONUS;
}

public static void setBONUS(int bONUS) {
BONUS = bONUS;
}

public SCWCD(){}
public SCWCD(int t1, int t2, int t3, int t4){
this.t1 = t1;
this.t2 = t2;
this.t3 = t3;
this.t4 = t4;
}
public static void prLine(){
System.out.println("***************");
System.out.println("    SOLDESK    ");
System.out.println("       JAVA    ");
System.out.println("***************");
}
}

public class SCWCDmain {
public static void main(String[] args) {
//클래스.static메소드명();
SCWCD.prLine();
}
}

이런 식으로 그냥 클래스명으로 호출 가능하다.
-----------------------------------------------

객체를 생성하면 멤버변수 같은 건 그냥 기본 지정된 값으로 초기화되는데
static변수는 처음에 한번 특정값으로 초기화되고 끝임.
그리고 나서 값을 변경해주면 증가나 감소가 된다.

또 객체를 여러개 생성해도 한번만 생성이 된다.
- 멤버 메소드에 static 변수를 선언할 수 없다.

package day07;

class Box {
int cnt = 0;
static long boxID = 0;
static int count = 0;
//자주 쓰는 것만 static 

public Box() {
boxID = boxID + 1;
cnt = cnt + 1;
System.out.println("멤버 변수 cnt: " + cnt);
System.out.println("static 변수 BoxID: " + boxID);
}


// // 멤버 메소드에서는 static 변수를 선언할 수 없습니다.
// public void staticTest() {
// static long count = 0;
// //static이 들어가서 data영역으로 가야하는데
// //지역변수라서 stack에 가야함 -_-);;
// //근데 메인문 전에 static변수 할당이 끝나야되어서
// //static 사용 불가능
// count = count + 1;
// }

//static 메소드에 static 변수를 선언할 수 없습니다.
public static void staticTest2(){
//static이든지 말든지 메소드 안에서는 
//변수 만들면 무조건 stack영역임
static int count = count+1;
System.out.println("count: " + count);
}

}
public class StaticDemo {
public static void main(String[] args) {
Box.staticTest2();
Box.staticTest2();
Box.staticTest2();
Box.staticTest2();
Box mybox1 = new Box();
// Box mybox2 = new Box();
// Box mybox3 = new Box();
mybox1.staticTest2();
}
}



어쨌든 static은 사용할 때만 사용해야 함... 메모리 낭비인것


static: 생성 없이 클래스 영역 안에 속한 static이란 메모리 영역안에 오직 하나만 생성되서,

여러 인스턴스가 동시에 공유할 수 있도록 되어있는 것


그래서 클래스당 하나고, 정적으로 먼저 생성된 것들 - data영역


가능한 static 종류는  - 정적 멤버 변수, 정적 메소드, 정적 내부 클래스


이걸로 다 만들면 setter getter 안써서 짱 편한데 안 쓰는 이유는 

1. 메모리 부족

2. 그리고 *로 import하면 정적 자원이 메모리에 과다하게 들어가니까 *로 import 하지 말 것 - Integer같은거...


--------------날라가고 다시 ---------------------


package day07;


class Final {


int money = 10000;


final int day = 7;

final int week = 4;


// 객체를 만들지 않아도 사용할 수 있습니다.

// final static 변수

final static int month = 12; // 1년 // = final과 static 두개의 특징을 다 가진 것


public Final() {

}


}


public class FinalMain {

public static void main(String[] args) {

Final fi = new Final();

fi.money = 15000;


// final 변수는 값을 변경(대입)할 수 없습니다.

// fi.day = 10;

System.out.println("1주일 용돈: " + fi.money * fi.day);

System.out.println("1년: " + Final.month + "달");

// Final.month = 20000;

}

}


이거 Final.month하고 fi.month 하고 같은 애임 - 스태틱이라서

---------이게 여기까지임 ----------------------------
http://www.lectureblue.pe.kr/reqtiles/read.jsp?bbsno=13&nowPage=1&col=&word=&code=1
13회차까지

이거 메모리 어디에 위치하는 지 써보기...:>
------------------------------위에 날아간 거 다시 적기-------------12회차~13회차 다 날아감 ㅠㅅㅠ...

Access Modifier - 접근 한정자 = 제한자 = 수정자

public으로 변수를 만들면 - 아무데서나 접근 가능 (남의 클래스에서도)
private 로 변수를 만들면 - 처리 기능을 메소드로 구현해서 캡슐화 o

클래스간에 멤버 변수나 멤버 메소드에 접근하는 것을 제한함.
클래스간에 간섭을 줄이기 위해 적용함.

클래스간에 간섭을 막을 수 있음으로 콤포넌트의 독립성을 강화할 수 있다 
ㄴ 만약에 각각 컴포넌트 간 연관성이 있으면 작은 부분만 필요할 때 큰 게 줄줄 딸려온다거나 해서 유지보수나 코드 수정이 용이하지 않음.

----------------------------------------------------------------------------------------- 
접근 제한자   같은 클래스    같은 패키지    상속관계의 다른 패키지    관련없는 다른 패키지 
                             (같은 폴더)        (폴더 상관없음)          (다른 폴더)   
------------ ----------------------------------------------------------------------------- 
private          ○               X                 X                       X  (중요) 
----------------------------------------------------------------------------------------- 
friendly         ○               ○                X                       X 
----------------------------------------------------------------------------------------- 
protected        ○               ○                ○                      X   
------------------------------------------------------------------------------------------ 
public           ○               ○                ○                     ○ (중요) 
------------------------------------------------------------------------------------------ 

private - 같은 클래스만 접근 가능
friendly = default = 아무것도 없는거  - 같은 클래스, 패키지까진 접근 가능
protected - 같은 클래스, 패키지, 상속관계에 있는 다른 패키지까진 접근 가능
public - 다가능...

private - 이랑
public -  을 잘 쓴대... :>

package day07;

class Data {
private String name = null;
private String season = null;
private int year = 0;

public void setName(String name) {
this.name = name;
}

public void setSeason(String season) {
this.season = season;
}

public void setYear(int year) {
if (year >= 20 && year <= 30) {
this.year = year;
} else {
System.out.println("입력될 수 있는 나이 20~30세 사이입니다.");
}
}
public String getName(){
return name;
}
public String getSeason(){
return season;
}
public int getYear(){
return year;
}

}

public class DataAccess {
public static void main(String[] args) {
Data d = new Data();
// d.name = "왕눈이";
// System.out.println(d.name);
// d.name("왕눈이"); <-이거는 private 쓰면 접근 불가
d.setName("왕눈이");
d.setSeason("늦가을");
d.setYear(35);

System.out.println(d.getName());
System.out.println(d.getSeason());
System.out.println(d.getYear());
}
}

------------------------------------------
private는 외부에서 호출될 수 없음.
package day07;

class PrivateTest {
public int kuk = 0;
public int eng = 0;
public int sum = 0;

private void sum() {
sum = kuk + eng;
if (sum > 200) {
System.out.println("점수가 200을 초과했습니다.");
sum = 0;
} else {
System.out.println("합계가 정상적으로 처리?습니다.");
}
}

// Deligate Method - 직접 접근 못하니까 대리자...
//이런 경우 별로 많지 않은 것
public void call_sum() {
sum();
}
}

public class PrivateTestMain {
public static void main(String[] args) {
PrivateTest pt = new PrivateTest();
pt.kuk = 90;
pt.eng = 95;

// pt.sum(); //외부에서 호출할 수 없습니다.
pt.call_sum();
System.out.println("pt.sum(): " + pt.sum);
}
}


------------------------------마지막시간---------------------------
Garbage Collecting 

1. 멤버변수와 객체에 할당된 메모리를 회수한다.
2. JVM이 자동으로 수행한다.
3. 멤버 메소드등 일반 메소드안에서 생성된 객체가 메소드의 지역변수에서 참조 할 때 - 메소드 종료시 자동으로 메모리 회수!

null값을 가지고 있는 객체변수가 있을 때 걔가 참조했던 객체는 회수의 대상
그리고 이거 별로 순위가 안 높아서 다른 애들 다 끝나면 수행

gc()를 실행하면 강제로 메모리 회수 작업을 하게 되는데 - finalize()메소드호출
이거 근데 별로 안 쓰는 편이 좋은 거래 왜냐면 잘못하면 과부하걸림...

생성자 - 만약에 내가 안 쓰면 자동으로 호출됨
소멸자 - finalize() - 자동 호출 되지 않음  = 폴백 (fallback) 메소드  -굳이 강제로 안 해도 될거 같은 느낌


해시코드값 같은 것 머리가 아픈것

힙에서의 삶과 힙에서의 삶과 죽음 넘나 철학적인것 -_-);;
그러니까 그냥 객체 위치를 가리키는 해시코드값이 사라질 시기 같은 거임... 

참조하는 애 없으면 gc가 할 일 없을때 가서 finalize()호출해서 없애줌 

//가비지 컬렉터 소스 안 쳐봤음 - 쳐보기

 >>>>> GarbageTest.java 

class Garbage { 
     
    int objNo; 
     
    public Garbage(int n) { 
        objNo = n; 
        System.out.println("Garbage class " + objNo + " 이 만들어 졌습니다."); 
    } 

    //객체의 메모리가 회수 될때에 자동으로 호출됩니다. 
    protected void finalize() throws Throwable { 
        System.out.println("Garbage class " + objNo + " 에서 쓰이던 메모리가 수집되었습니다."); 
        super.finalize(); 
    } 
} 

public class GarbageTest { 

    public static void main(String[] args) { 

        Garbage[] ga = new Garbage[10]; 
         
        //객체 생성 
        for (int i=0; i < ga.length; i++) { 
            ga[i] = new Garbage(i); 
        } 

        //객체 메모리 해제  
        for (int i=0; i < ga.length; i++) { 
            ga[i] = null;//메모리 회수의 대상이 됩니다. 
        } 

        //강제로 가베지컬렉션 기능 수행  
        System.gc(); 
    } 
} 





5. 수업

진도: 

hw: 


6. 할것


소스코드 메모리 영역 적어보기.


DecimalFormat 외울 것 - 집에 가기 전에 한번 짜 볼 것.


package day07;


import java.text.DecimalFormat;


public class TestDecimalFormat {

public static void main(String[] args) {

double testnum;

DecimalFormat d = new DecimalFormat(".###");

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.println("입력하세요: ");

testnum = s.nextDouble();

System.out.println(d.format(testnum));

}

}


짰음.


Studydesk 인강 볼 것. 


ocjp - 할인중 (6월까지 신청할 것)

http://itandgame.tistory.com/128

여기 덤프 있음

'Programming' 카테고리의 다른 글

160324: 9회차  (2) 2016.03.24
160323: 8회차  (1) 2016.03.23
160321: 6회차  (1) 2016.03.21
160318: 5일차  (2) 2016.03.18
160317: 4회차  (3) 2016.03.17
Posted by DAVID

160321: 6회차

Programming 2016. 3. 21. 13:21

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것

아침엔 클래스랑 객체 리뷰


<<메모리친구>>

힙: 객체 + 배열 - 얘네는 멤버변수 크기만큼 잡음(메모리 낭비 심한것)

스택:: 지역변수 - 부르면 챱챱

코드: 메소드

데이터: 얜 나중에 :>


클래스: 객체 정의 + 객체의 모임    -붕어빵틀    -은행계좌(발급용)

객체: 얘가 실체임 ㅇㅇ = 인스턴스    -붕어빵    -ㅁㅁ의계좌


빵먹고싶당


Class 만들 때 메소드처럼 클래스명() 이렇게 만들면 안됨... 자꾸 헷갈리는것


클래스(파라미터 = 매개변수 = 인자)

파라미터는 데이터 호출용인데 this.인자 = 값 하면 접근 가능함.


객체는 서로 독립적인 형태로 사용하쉬는것


객체 생성할 떄는 new를 쓴다 = 메모리 할당 용도.


메소드를 기본형 인자로 생성을 하면 return 없으면 안돌아감...

void는 리턴값 없어도 되어서 괜찮음.


메소드안에서 자기네 클래스 다른 메소드 호출 가능 - ㅇㅇ


메소드는 많이 만들어도 성능 저하는 없음.

멤버 변수는 많이 만들면 성능 저하가 있는것 ㅠㅠ


자바는 포인터가 없어서 그...그거는 불가능 (-_-);;; - 그거 ... ㅇ...



--------------------------------------------------------


객체:


상속

다형성

캡슐화 - 세터 & 게터 사용해서 접근 하는 것 - 안에 있는 성분은 모르는데 사용하는 법은 아는것 ((ex) 감기약 같은)


- 캡슐화:

 private로 멤버변수를 선언하면 그 클래스 내에서밖에 접근을 못함 

- 예를 들어 main이 있는 클래스에서 private로 선언된 남의 클래스 변수를 직접 못 접근하니까

setter랑 getter (값을 저장하고 / 가져오고) 를 꼭 선언해줘야 한다.


이게 메소드 이름이 setter가 아니라 그냥 기능적인 요소 


private String name;

private int bonbong;

public void setName(String name){

}


요러면 위에 지역변수 name은 힙 영역

밑에 파라미터는 스택영역에 메모리를 잡아서 이름이 같아도 되긴 하는데

이름이 같을 경우

public void setName(String name){

name = name;

}

요렇게 하면 어느 name인지 모르니까 // 사실 자기가 속한 지역변수가 우선이라서 저건 파라미터 = 파라미터 라는 식임 

this.name = name; 으로 고치면

this.name은 위에 지역변수고

name은 파라미터인것.


public void setName(String name){

this.name = name;

}

어쨌든 이게 세터


public String getName(){

return name;

}

이게 게터.


근데 지역변수랑 파라미터랑 이름이 같지 않으면 this 안 써줘도 됨...


세터랑 게터를 하나하나씩 다 만들어 줘야 하는군

안써도 게터를 만들어 줘야 함



2교시때까지 저번 주 코드를 setter getter로 고치는 거 하고있음.



식별자 이름  setName 같이 set 다음에 대문자 한번 써줄 것.

오류는 안 나는데 나중에 프로젝트 하거나 다른 사람과 협업 할 시 귀찮아지니까...

-> 이뿌게 쓸것


이런 이클립스에서 이거 자동 생성할 수 있는 거였음 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

으아아 그래도 코딩 연습을 잘 했슴니다 :<


아니 그냥 세터 게터를 하나씩 만들어주고 세터를 호출해주는 메소드를 만들면 되겠군...? 귀찮음맨인것 ...

ㄴ 이건 생성자를 통해서 한번에 박을수가 있어서 필요없는것... 그러니까 저것은 따로 쓰려고 만든 애입니다

이런것도 되나


------------------------------------------------


멤버 메소드

main은 멤버 메소드가 아님

근데 메인 말고는 다 멤버 메소드라고 생각하면 그것도 아니긴한데 일단 ... 내가 만든 건 다 멤버 메소드임.


메소드네 인스 데이터 타입은 리턴값과 일치해야함 

그리고 파라미터랑 호출시 데이터 타입도 일치해야함 - 그러니까 데이터 형 맞추라고 

또한 매개변수 써야 하는 거에 안 쓰면 또 오류남. - 주의할 것


메소드 오버로딩  -과

메소드 오버라이딩 - 을 사용해서 메소드를 확장시킴

ㄴ 나중에 하실것


리턴타입 메소드명(파라미터){

메소드내용

}





-유효 범위-


1. 멤버변수(=인스턴스 변수, 필드) - 힙 메모리 이용

메소드 밖에 선언됨

모든 메소드가 사용 가능

변수 사용이 끝나도 GC에 의해 회수 되기 전에는 할당 메모리 유지함. - 그래서 많이 만들면 메모리 낭비인것

GC: 가비지 컬렉터임

값을 안 줘도 기본 값으로 초기화됨! - null, 0, false 이런거...


2. 지역변수 - 스택 메모리 이용

메소드 안에 선언됨

이용이 끝나면 메소드 영역이 없어지면서 변수도 회수됨.

굳이 초기화 안하면 못 쓴다!


그러니까 스택 메모리 쓸 때는 임시적으로(지역변수) 쓰는 거니까 넣었다 뺐다 하기 좋은 스택

힙은 고정적으로 쓰고 ㅂㅂ 할거니까 관리할 수 있는 힙 (객체와 배열 방을 만듬)


// this로 멤버변수 접근

전역 변수 스트링은 정수형크기 정도 되겠다 싶은 것...


package day06;


public class Variable {

String movie = "트로이"; // heap memory


public void show() {

System.out.println("show 메소드 영역: " + movie);

// movie라는 지역변수의 부재로 전역변수 출력

}


public void title() {

String movie = "아마겟돈"; // stack memory

System.out.println("title 메소드 영역: " + movie); // 아마겟돈

System.out.println("title this.movie: " + this.movie);// 트로이

}


public static void main(String[] args) {

Variable v = new Variable();

//show 시작하면 스택 영역에 메모리 잡고

v.show(); // 트로이

//show 끝나면 스택 영역에 메모리 잡았던거 사라지고

v.title(); // 아마겟돈 트로이

}

//메인 끝나고 바로 해제하는 게 아니라 가비지컬렉터가 놀다가 얘를 참조하는 애가 아무도 없을 때 메모리 삭제 - 할거 많으면 천천히 삭제

}


----------------------------


package day06;


public class Variable {

String movie; // heap memory


public void show() {

System.out.println("show 메소드 영역: " + movie);

// movie라는 지역변수의 부재로 전역변수 출력

}


public void title() {

String movie; // stack memory

System.out.println("title 메소드 영역: " + movie); // 아마겟돈

System.out.println("title this.movie: " + this.movie);// 트로이

}


public static void main(String[] args) {

Variable v = new Variable();

v.show(); // 트로이

v.title(); // 아마겟돈 트로이

}

}


요렇게 하면 지역변수 movie는 초기화 안해줬다고 오류 뜸
멤버변수는 오류 x (null값이 기본값)


package day06;


public class Block {

String Block = "재미있는 영화"; // 멤버변수 힙


public static void main(String[] args) {

Block b0 = new Block();


String b1 = "트로이"; // 지역변수 스택

System.out.println("Movie: " + b1);


{

String b2 = "우주전쟁"; // 얘는 지역변수

System.out.println("Movie: " + b2);


int i = 0; // 얘도 지역변수


for (int j = 0; j < 5; j++) {

// j도 지역변수다

}

// System.out.println(j); //이거 for문 안의 지역변수라서 x


for (i = 0; i < 5; i++) {


}

System.out.println("i: " + i);// 얘는 선언을 밖에서 해서 ㄱㅊ

} // end {}


System.out.println("Movie: " + b1);

System.out.println("테스트: " + b0.Block);

// System.out.println("Movie: " + b2); //이거 {}안의 지역변수임


}// end main

}



근데

//Block b0 = new Block();

//System.out.println("테스트: " + b0.Block);

요렇게 하면 Block 스택 메모리 잡지 않음


---------------------------------------------------


Call by Value - 값에 의한 호출 

ㄴ 이거는 메소드 호출시 값을 주는것 

보통 숫자 계열 - 근데 그냥 기본형이면 거의 다 되는것인듯

문자도되고

숫자도되고 어쨌든 예시


구냥 메소드(정수) <- 이렇게 생겼으면 콜바이밸류

값을 복사하는 개념이라서 call by value



Call By Value 예시는 .java 파일 2개 뜨는 것...

그리고 생성자도 써보았다.

생성자는 리턴 타입이 없으신것


public class Person{

public Person(String s){

name= s;

}

}

저렇게 생김.

public Person(String name){

this.name = name;

}

이거랑 같은거지만 그냥 s로 쓰셨길래...


package day06;


class Code{

public String getArea(int index){

String [] areas = {"서울", "천안", "대전", "대구", "광주", "강릉"};

return areas[index-1];

}

}


public class CodeUse {

public static void main(String[] args) {

Code co = new Code();

String area = co.getArea(6);

System.out.println(area);

}

}



요기서
co.getArea(6) <- 이부분이 Call by value







Call by Reference 

ㄴ 이거는 메소드 호출시 해시코드를 주는것

상수 문자열

메소드로 참조 타입을 전송 가능
참조값을 전달한 애는 값 변화 & 힙 메모리 공유한다.


예시가 이건데


package day06;


class SchoolVO {

String name = "";

int kuk;

int eng;

int tot;

double avg;

public SchoolVO(String name, int kuk, int eng){

this.name = name;

this.kuk = kuk;

this.eng = eng;

tot = kuk + eng;

avg = (double)tot/2;

}

}


class SchoolProc2{

public void print(SchoolVO v){

System.out.println("vo.name: " + v.name);

System.out.println("vo.kuk : " + v.kuk);

System.out.println("vo.eng : " + v.eng);

System.out.println("vo.tot : " + v.tot);

System.out.println("vo.avg : " + v.avg);

}

}


public class SchoolUse2 {

public static void main(String[] args) {

SchoolVO vo = new SchoolVO("길동", 85, 80);


// vo.name = "길동";

// vo.kuk = 90;

// vo.eng = 80;

// vo.tot = vo.kuk+vo.eng;

// vo.avg = vo.tot/2;

SchoolProc2 sp = new SchoolProc2();

sp.print(vo);

}

}


여기선 sp.print(vo); 부분이 call by reference 인것 - 왜냐면 vo의 해시코드 값을 주는 것이기 때문에

package day06;


class SchoolVO {

String name = "";

int kuk;

int eng;

int tot;

double avg;

public SchoolVO(String name, int kuk, int eng){

this.name = name;

this.kuk = kuk;

this.eng = eng;

tot = kuk + eng;

avg = (double)tot/2;

}

}


class SchoolProc2{

public void print(SchoolVO v){

System.out.println("vo.name: " + v.name);

System.out.println("vo.kuk : " + v.kuk);

System.out.println("vo.eng : " + v.eng);

System.out.println("vo.tot : " + v.tot);

System.out.println("vo.avg : " + v.avg);

System.out.println("SchoolProc2()-vo 해시코드: " + v.hashCode());

}

}


public class SchoolUse2 {

public static void main(String[] args) {

SchoolVO vo = new SchoolVO("길동", 85, 80);


// vo.name = "길동";

// vo.kuk = 90;

// vo.eng = 80;

// vo.tot = vo.kuk+vo.eng;

// vo.avg = vo.tot/2;

System.out.println("main()-vo 해시코드: " + vo.hashCode());

SchoolProc2 sp = new SchoolProc2();

sp.print(vo);

}

}


요렇게 하면 해시코드 값이 동일한 걸 확인할 수 있음.
주소값 = 해시코드 복사!

그래서 같은 곳을 가리키게 되기 때문에 영역을 공유한다고 함.


//schoolProc2도 변수를 만들지는 않지만 해시코드가 있긴 있음.



-------------------------밥-----------------------------

먹고 와서 이거 하는 중임


package day06;


class Pay {

int ppp;


public void payRefer(Pay a) {

a.ppp = a.ppp + 2000;

}


public void payValue(int j) {

j = j + 2000;

}


}


public class PayTest {

public static void main(String[] args) {

Pay p = new Pay();

p.ppp = 10;

int i = 10;


p.payRefer(p);// cb reference

p.payValue(i);// cb value p.payValue(10)이랑 같은 것 - 변수값을 준다고 cbr이 아닌것 :>


System.out.println(p.ppp);// 2010

System.out.println(i); // return을 안받아서 그냥 i = 10

}

}


근뎅 

public void payRefer(Pay a) {

a.ppp = a.ppp + 2000;

}

이럴 경우에

public void payRefer(Pay a) {

a.ppp = a.ppp + 2000;

a.payRefer(null);

}


이렇게 넣으면 어떻게 되지 - 메소드 파라미터로 자기 자신의 클래스를 받을 때 'ㅅ')...? - 생성자는 배울 것


ㅠㅠ리액션이 안좋은것...


그리고 왜

public int payValue(int j) {

j = j+2000;

System.out.println(" " +j);

return j;

}

하면 리턴값이 2010이 아니라 10이지?


아 이게 지역변수라서 j가 메소드 완료되면 없어져서 그런가보당 맞나 -> 아님 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ


i = p.payValue(i);

i에다가 안넣음 ㅋㅋㅋㅋㅋㅋ


package day06;


class Pay {

int ppp;

int num;

public void payRefer(Pay a) {

a.ppp = a.ppp + 2000;

//a.payRefer(null);

}


public int payValue(int num) {

this.num = num+2000;

// System.out.println(this.num);

return this.num;

}


}


public class PayTest {

public static void main(String[] args) {

Pay p = new Pay();

p.ppp = 10;

int i = 10;


p.payRefer(p);// cb reference

i = p.payValue(i);// cb value p.payValue(10)이랑 같은 것


System.out.println(p.ppp);// 2010

System.out.println(i); // return을 안받아서 그냥 i = 10

}

}


마지막에 i에다가 넣어줘야 한다!
결과값 이상할 때는 메인문 확인해 볼 것....!!!!!


call by value

매개 변수 전달 방식: 값 복사

장점: 원본 값 보호 가능

단점:  메모리 낭비...(별로 안심함)

매개변수 타입: 기본 데이터 타입


call by reference

매개 변수 전달 방식: 레퍼런스 넘겨줌(해시코드)

장점: 메모리 절약(기억장소 공유)

단점: 원본 값 변환됨

매개변수 타입: 레퍼런스(참조)타입 (배열도 포함)


------------------------------------------------


String 객체는 의외로 call by reference인데

call by value 같이 생겼음... - 기본형 변수 타입이 아닌것...


문자열 타입은 - 스트링 / 스트링버퍼 / 스트링빌더 가 있는데

스트링만 불변의 특징이 있는것


얘는 다른 애들하고 달라서 "한번정한글자" 를 "한번정한글자당" 으로 바꿀 수 없음.

그냥 "한번정한글자" 가 땡


그리고 클래스인데도 new 안써도됨 ㅇㅇ String name = new String()일케 안써도 됨

그냥 String name = "홍길동" 하면 객체화 완료


그런데 StringBuffer 는 StringBuffer sb = new StringBuffer("홍길동"); 한다음에

StringBuffer sb2 = new StringBuffer("홍길동"); 하면 sb의 홍길동과 sb2의 홍길동은 다른 홍길동인것


근데 String은 

String name = "홍길동"; 하고 String name2 = "홍길동"; 이 가리키는 해시코드값이 동일함 (메모리상으로 하나인것)


만약에 문자열 변경할 때 "안녕" -> "안녕하세요" 했으면

이거 메모리가 해제 안되고 그냥 안녕도 있고 안녕하세요도 있는것...

그러니까 문자열 계속 변경되는 프로그램이면 스트링버퍼 이런걸 써야함 ... <<- 스트링쓰면 메모리 많이 잡아먹는것




문자열 비교할 때는 == 쓰지말고 equals 쓰자!!!


        //System.out.println("ABCD".toLowerCase());  //소문자로 변환     

            //System.out.println("abcd".toUpperCase());  //대문자로 변환

        //System.out.println("ABCD".hashCode()); //해시코드 출력




package day06;


public class StringTest {

public void changeString(String src) {

src = "JSP";

}


public static void main(String[] args) {

// System.out.println("ABCD".toLowerCase());

// System.out.println("abcd".toUpperCase().hashCode());

// System.out.println("ABCD".hashCode());


String step = "JAVA";

StringTest st = new StringTest();

System.out.println(step);


st.changeString(step);//JSP로 변경하기 위해 할당 -> 이긴한데 아까 내가 틀린것처럼 

//step = st.changeString(step);으로 안 고쳐주면 쟤는 증발하는 메소드의 멤바라서 값 차이 없음

System.out.println(step);

}

}


//call by reference치고 넘나 value 같은 것...-_-);;;;;

//


이거 했음.

public void changeString(String src) {

src = "JSP";

}

요게 값을 바꾸는 게 아니라 "JSP"라는 객체를 생성하는거임
그러니까 step이 가리키는 "JAVA"의 값을 바꿔주는 게 아니라서 별반 차이 없음.
결국 결과값을 도출하기 위해서는 값을 받지 않으면 GC인것


저거 위에도

public String changeString(String src) {

return "JSP";

}

이렇게 바꿔주고 step = st.changeString(step) 해줘야 값이 도출된다.

이거 값 받는 걸 자꾸 빠트리니까 메인 문 확인 조심해서 할 것!!!!



멤버변수 = 필드 = 인스턴스변수



package Test_day06;


class Goods {

private String name;

private int price;

private int numberOfStock;

private int sold;


void setName(String name) {

this.name = name;

}


void setPrice(int price) {

this.price = price;

}


void setNumberOfStock(int numberOfStock) {

this.numberOfStock = numberOfStock;

}


void setSold(int sold) {

this.sold = sold;

}


String getName() {

return name;

}


int getPrice() {

return price;

}


int getNumberOfStock() {

return numberOfStock;

}


int getSold() {

return sold;

}


Goods(String name, int price, int numberOfStock, int sold) {

this.name = name;

this.price = price;

this.numberOfStock = numberOfStock;

this.sold = sold;

}// 생성자


}


public class GoodsArray {

public static void main(String[] args) {

Goods goodsArray[] = new Goods[3];


for (int i = 0; i < goodsArray.length; i++) {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("입력하세요: ");

String name = s.next();

int price = s.nextInt();

int n = s.nextInt();

int sold = s.nextInt();

goodsArray[i] = new Goods(name, price, n, sold);

} // end for


for (int i = 0; i < goodsArray.length; i++) {

System.out.print(goodsArray[i].getName() + " ");

System.out.print(goodsArray[i].getPrice() + " ");

System.out.print(goodsArray[i].getNumberOfStock() + " ");

System.out.println(goodsArray[i].getSold() + " ");

} // end for

}

}



이거 입력하세요 부분 없으면 아무것도 안 뜨는것처럼 나옴... -_-);;;
이클립스클라스...

생성자! 
생성자의 매개변수를 통해서 초기화도 하고 입력도 받고 편함 ㅇㅇ

Goods goodsArray[] = new Goods[3];

이거는 

Goods [] goodsArray;

goodsArray = new Goods[3]; 하고 같은거임


static 메소드 사용해 보았다!


package Test_day06;


public class ArrayParameter {


static void replaceSpace(char a[]) {

for (int i = 0; i < a.length; i++) {

if (a[i] == ' ') {

a[i] = ',';

// 만약에 공백이 있으면 ,로 바꿔줌.

} // end if

} // end for

}// end replaceSpace


static void printCharArray(char a[]) {

for (int i = 0; i < a.length; i++) {

System.out.print(a[i]);

}//end for

System.out.println();

// 배열의 문자 출력 -> 다 찍으면 줄바꿈

}//end printCharArray


public static void main(String[] args) {

char c[] = {'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 'p' , 'e', 'n', 'c', 'i', 'l', '.'};

printCharArray(c);

replaceSpace(c);

printCharArray(c);

}

}


처음엔 그냥 찍어보고 + 공백을 ,로 바꾸고 찍어주고

오!
메소드는 <<코드>>영역에 메모리가 할당되는데 
static이 붙은 메소드나 변수는 <<데이터>> 영역에 메모리가 할당된다.

코드영역 - 해시코드를 통해 접근 필요 (메소드만 옴)
데이터영역 - 객체 생성할 필요 없이 클래스를 통해 바로 변수에 접근 가능 (메소드랑 변수가 옴)


이거 생성자를 이용해서 입력받게 고쳐보기.


package Test_day06;


import java.util.Scanner;


class realCalc {

String cal_num;

double num1, num2;

double printnum;

Scanner s = new Scanner(System.in);


// +

public double pls() {

return num1 + num2;

}


// -

public double min() {

return num1 - num2;

}


// *

public double mul() {

return num1 * num2;

}


// /

public double div() {

return num1 / num2;

}


// %

public double res() {

return num1 % num2;

}


public void inputNumber() {

System.out.print("연산자를 입력하세요: ");

this.cal_num = s.nextLine();


System.out.print("계산할 숫자 두개를 입력하세요: ");

this.num1 = s.nextInt();

this.num2 = s.nextInt();

}


public void printNumber() {

System.out.println("연산자는: " + cal_num);

System.out.println("결과값은: " + printnum);

}


public void calcInput() {

switch (cal_num) {

case "+":

printnum = pls();

break;

case "-":

printnum = min();

break;

case "*":

printnum = mul();

break;

case "/":

printnum = div();

break;

case "%":

printnum = res();

break;

}// end switch

}

}


public class Calculator_machine {

public static void main(String[] args) {

realCalc rc = new realCalc();

rc.inputNumber();

rc.calcInput();


rc.printNumber();


}

}


응 생성자를 이용해서 입력받게 고치고 변수도 더 줄였음.


package Test_day06;


class realCalc {

int num0;// 입력용 연산자

double num1, num2;// 입력용 숫자1, 숫자2 - 숫자 2를 저장으로 사용


String printbuho;// 부호 출력


realCalc() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("연산자를 입력하세요(1 = +, 2 = -, 3 = *, 4 = /, 5 = %) \n: ");

this.num0 = s.nextInt();


System.out.print("계산할 숫자 두개를 입력하세요: ");

this.num1 = s.nextDouble();

this.num2 = s.nextDouble();

}


// +

public double pls() {

printbuho = "+";

return num1 + num2;

}


// -

public double min() {

printbuho = "-";

return num1 - num2;

}


// *

public double mul() {

printbuho = "*";

return num1 * num2;

}


// /

public double div() {

printbuho = "/";

return num1 / num2;

}


// %

public double res() {

printbuho = "%";

return num1 % num2;

}


// public void inputNumber() {

// System.out.print("연산자를 입력하세요: ");

// this.num0 = s.nextInt();

//

// System.out.print("계산할 숫자 두개를 입력하세요: ");

// this.num1 = s.nextDouble();

// this.num2 = s.nextDouble();

// }


public void printNumber() {

System.out.println("연산자는: " + printbuho);

System.out.println("결과값은: " + num2);

}


public void calcInput() {

switch (num0) {

case 1:

num2 = pls();

break;

case 2:

num2 = min();

break;

case 3:

num2 = mul();

break;

case 4:

num2 = div();

break;

case 5:

num2 = res();

break;

}// end switch

}

}


public class Calculator_machine {

public static void main(String[] args) {

realCalc rc = new realCalc();

// rc.inputNumber();

rc.calcInput();


rc.printNumber();


}

}



-----------------------------배열----------------------


package Test_day06;


class realCalc2 {

int num0;// 입력용 연산자

double num[] = new double[2];// 입력용 숫자 1,2 - 2를 출력용으로 사용

String print_modulus;// 부호 출력용


realCalc2() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("연산자를 입력하세요(1 = +, 2 = -, 3 = *, 4 = /, 5 = %) \n: ");

this.num0 = s.nextInt();


System.out.println("계산할 숫자 두개를 입력하세요: ");

for (int i = 0; i < num.length; i++) {

System.out.print((i + 1) + "번째 숫자를 입력하세요: ");

num[i] = s.nextDouble();

}

}


public void printNumber() {

System.out.println("연산자는: " + print_modulus);

System.out.println("결과값은: " + num[num.length - 1]);

}


public void calcInput() {

switch (num0) {

case 1:

print_modulus = "+";

num[num.length - 1] = num[num.length - 2] + num[num.length - 1];

break;

case 2:

print_modulus = "-";

num[num.length - 1] = num[num.length - 2] - num[num.length - 1];

break;

case 3:

print_modulus = "*";

num[num.length - 1] = num[num.length - 2] * num[num.length - 1];

break;

case 4:

print_modulus = "/";

num[num.length - 1] = num[num.length - 2] / num[num.length - 1];

break;

case 5:

print_modulus = "%";

num[num.length - 1] = num[num.length - 2] % num[num.length - 1];

break;

}// end switch

}

}


public class Calculator_machine2 {

public static void main(String[] args) {

realCalc2 rc = new realCalc2();

rc.calcInput();


rc.printNumber();


}

}


Math.sqrt = 루트임 ㅋㅋㅋㅋㅋ
으아 도형 둘레 넓이 ㅋㅋㅋㅋㅋㅋㅋㅋ

캡슐화 private!
setter getter ㅋㅋㅋㅋㅋㅋㅋ - 생성자금지

------------어 하다 끊김 ---------------

package Test_day06;

//파이: Math.pi
class Circle{
//변수는 private
private double num;
private double value;
java.util.Scanner s = new java.util.Scanner(System.in);
public void setNum(){
num = s.nextDouble();
}//setter
public double getNum(){
return num;
}//getter
public void area(){
value = num * num * Math.PI;
}//넓이
public void round(){
}//둘레
public void radius(){
}
//반지름
}

class Triangle{
private int num;
public void area(){
}//넓이
public void round(){
}//둘레
//세변길이
}

class Rectangle{
private int num;
public void area(){
}//넓이
public void round(){
}//둘레
//가로세로길이
}

public class Shape {
public static void main(String[] args) {
}
}



------------------------------------------------

http://mathbang.net/99

http://tip.daum.net/question/60107844https://www.google.co.kr/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%EB%84%93%EC%9D%B4%EC%99%80+%EB%91%98%EB%A0%88+%EA%B5%AC%ED%95%98%EB%8A%94+%EA%B3%B5%EC%8B%9D


어 다 짰는데 수정해볼 거 있나 보기..


package Test_day06;


class Circle {

// 변수는 private

private double num;


public void setNum() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("반지름을 입력하세요: ");

this.num = s.nextDouble();

}// setter


public double getNum() {

return num;

}// getter


public double area() {

double val_area;

val_area = num * num * Math.PI;

return val_area;

}// 넓이


public double round() {

double val_round;

val_round = num * 2 * Math.PI;

return val_round;

}// 둘레


public void printShape() {

java.text.DecimalFormat d = new java.text.DecimalFormat(".##");

System.out.println("넓이: " + d.format(area()));

System.out.println("둘레: " + d.format(round()));

}// 출력


}


class Triangle {

private double num1, num2, num3;


public void setNum1() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("삼각형 한 변의 길이를 입력하세요.\n1): ");

this.num1 = s.nextDouble();

}// setter


public double getNum1() {

return num1;

}// getter


public void setNum2() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("삼각형 한 변의 길이를 입력하세요.\n2): ");

this.num2 = s.nextDouble();

}// setter


public double getNum2() {

return num2;

}// getter


public void setNum3() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("삼각형 한 변의 길이를 입력하세요.\n3): ");

this.num3 = s.nextDouble();

}// setter


public double getNum3() {

return num3;

}// getter


public double area() {

double val_area;

double sum = (num1 + num2 + num3) / 2;

val_area = Math.sqrt(sum * (sum - num1) * (sum - num2) * (sum - num3));

return val_area;

}// 넓이


public double round() {

double val_round;

val_round = num1 + num2 + num3;

return val_round;

}// 둘레


public void printShape() {

java.text.DecimalFormat d = new java.text.DecimalFormat(".##");

System.out.println("넓이: " + d.format(area()));

System.out.println("둘레: " + d.format(round()));

}// 출력


}


class Rectangle {

private double num1, num2;


public void setNum1() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("사각형 한 변의 길이를 입력하세요.\n1): ");

this.num1 = s.nextDouble();

}// setter


public double getNum1() {

return num1;

}// getter


public void setNum2() {

java.util.Scanner s = new java.util.Scanner(System.in);

System.out.print("사각형 한 변의 길이를 입력하세요.\n2): ");

this.num2 = s.nextDouble();

}// setter


public double getNum2() {

return num2;

}// getter


public double area() {

double val_area;

val_area = num1 * num2;

return val_area;

}// 넓이


public double round() {

double val_round;

val_round = (num1 + num2) * 2;

return val_round;

}// 둘레


public void printShape() {

java.text.DecimalFormat d = new java.text.DecimalFormat(".##");

System.out.println("넓이: " + d.format(area()));

System.out.println("둘레: " + d.format(round()));

}// 출력


}


public class Shape {

public static void main(String[] args) {

Circle david = new Circle();

Triangle david2 = new Triangle();

Rectangle david3 = new Rectangle();


david.setNum();


david2.setNum1();

david2.setNum2();

david2.setNum3();


david3.setNum1();

david3.setNum2();

david.printShape();

david2.printShape();

david3.printShape();

                  

}

}




5. 수업

진도: 

hw:

 

1. 커서 고정하는 법


6. 할것

졸려서 1교시 수업시간 끝나고 잤음...

1. 오늘은 일찍 잘 것

2. 자료구조 메모리 쪽 볼 것 (힙 스택)

3. 아무래도 BMO 지갑 사야함 (이유: 귀여움)

4. 머리카락을 자르러 가야함(안 피곤한 날? 'ㅁ')

5. 이모한테 전화할 것

6. 배타적 논리합 / 논리합 / 논리곱 한번 더 안보고 쓸 것

7. 오락실에 다트판 없나 봐야지...

8. 그리고 그냥 슬리퍼 갖다놔도 되지 않을까

9. http://www.lectureblue.pe.kr/reqtiles/gread.jsp?bbsno=473&nowPage=1&col=content&word=equals&code=5

이거 do-while로 짜보기.





*1. 하얀색 옷 살 것

*2. 마방진으로 하트 만들어보기


'Programming' 카테고리의 다른 글

160323: 8회차  (1) 2016.03.23
160322: 7회차  (4) 2016.03.22
160318: 5일차  (2) 2016.03.18
160317: 4회차  (3) 2016.03.17
160316: 3회차  (2) 2016.03.16
Posted by DAVID

160318: 5일차

Programming 2016. 3. 18. 18:29

1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것

하다보면 MySQL을 할 것임.

오전엔 복습을 하는 것.

- Day 02 

// 저번 기수는 박스오피스 웹사이트 만들었음.

// 5주 정도 프로젝트 하는 것 - 오~    

// 스프링 마이바티스 이런 애들도 쓸 줄 알아야 함미다 으아ㅏ아ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ


while( (i=s.nextInt()) != 0){ //s의 입력값이 0일 때까지 계속 돌리기

sum = sum+i;

n++;

}

이거 복습 하고 있음

s.nextInt() 이거 약간 단어가 안 익는다 - 아! s는 스캐너 변수인데 위에 있는것... (생략)


if(i%2==0){

sum = sum+i;

// System.out.println(i);

continue;

요거 짜는데 continue 안 넣었음... 오늘의 트롤은 Continue



[01] 제어문 예제
>>>>> Test01.java
public class Test01 {
           public static void main(String[] args) {
                     for (int i = 1; i <= 5; i++) { // 위에부분
                        for (int j = 1; j <i; j++) {
                                   System.out.print("*");
                        }
                        System.out.print("\n");
                     }
                     for (int i = 1; i <= 6; i++) { // 아래 부분
                          if(i>1){
                               for (int j = 0; j < i-1; j++) {
                                          System.out.print(" ");
                               }
                           }
                          for (int j = 1; j <=(6-i); j++) {
                            System.out.print("*");
                          }
                         System.out.print("\n");
                     }
           }
}


격파하였다


package day05;


public class Handle_test1 {

public static void main(String[] args) {

for(int i = 0; i<5; i++){

for(int j = 0; j<i; j++){

System.out.print("*");

}//end for2

System.out.println("");

}//end for1

//--------------up-----------------//

for(int k = 0; k<6; k++){

for(int m = 0; m<k; m++){

//지나감

//0

//01

//012

//0123

System.out.print(" ");;

}//end for2

for(int l = 5; l>k; l--){

System.out.print("*");

}//end for3


System.out.println(" ");

}//end for1


//--------------down---------------//

}//end main

}



-------------------------------------------------------

수업중인데


예제 Day03에 있는거

while(true){

if(s.nextInt() == -1){

break;

}

cnt++;

}

이렇게 짜는거 안 해봐서 어려움 해보기 ㅇㅇ

입력값 주는게 어렵다.


저거 썼을 때 -1 이후에 더 입력했더라도 -1전까지만 개수 카운트 해줌


배열 쓸 때

int arr[] = new int[5];

이렇게 뒤에 new를 통해서 만들어야 한다. - 해시코드가 만들어지쉬는것



package TestDay05;


import java.util.Scanner;


public class ArrayAccess {


public static void main(String[] args) {

// 5개짜리 정수 배열 만들어서 나중에 최대값 출력해주면 됩니다.

Scanner in = new Scanner(System.in);

int arr[] = new int[6];

arr[5] = 0;

for (int i = 0; i < (arr.length-1); i++) {

System.out.print((i+1) + "번째 정수를 입력하세요: ");

arr[i] = in.nextInt();


if (arr[arr.length-1] < arr[i]) {

arr[arr.length-1] = arr[i];

} // end if

} // end for

System.out.println("\n입력한 정수 중 가장 큰 수는 " + arr[arr.length-1] + "입니다.");


}// end main

}


에이씨 마지막 방을 가리키려면 배열.length-1 해야한다... 0부터니까 -_-+


오늘 배운거는 지역변수 특징 - 자신이 속한 단락 안에서만 사용 가능.


double은 int값 자동으로 형변환해서 강제형변환 안해도 된다.


//2차원 배열은 넘어갔습니다 - 해보기...


Day 4 하는중 


오 스캐너 사용할 때

java.util.Scanner in = new java.util.Scanner(System.in) 이렇게 쓰면 임포트 안해도 됨 ㅇㅇ..

그냥 문자열 입력 받을 때는 next() 쓰는거십니다

////////////////////////////

2번째거 *출력이랑 숫자 출력까지는 뽑았음 - 띄어쓰기를 만듭시다.

////////////////////////////


앜! 데시말포맷! DECIMALFORMAT - 이거 돈 관리하는 걸로 두번정도 짜보기!

Switch문도 써보기!!!!


예제 04 에서 성적만 수업시간에 했음 

substring = 문자열 추출

문자열의 index를 사용해서 변수의.substring(여기부터,조기까지) 추출 - 인덱스의 끝 인덱스의 바로 전까지만 추출 가능하다.


Calendar 같은 경우에는 객체를 생성한 뒤(변수같이 생겼음) 메소드를 통해서 값을 추출 가능


-------------발표하는데 버그남 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ------------------------------ 

equals를 씁시다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

package TestDay04;


public class Test_6 {

public static void main(String[] args) {


int cnt = 0;


while (true) {


if (args[cnt].equals("exit") ) {

System.out.println("입력 완료.");

break;

}


if (Integer.parseInt(args[cnt]) == 0) {

System.out.println(args[cnt] + "은 0");

} else if (Integer.parseInt(args[cnt]) < 0) {

System.out.println(args[cnt] + "은 음수");

} else

System.out.println(args[cnt] + "은 양수");


cnt++;

}

}


}


으아아 문맥적 버그ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 사바ㅏㅂㄷㅈㅂㄷㅈㅂㄷㅈㅂ덥ㅈㄷㅈㅂ
어쨌든 equals라는 애를 알았습니다 넘나좋은것...

==랑 equals의 차이는 ==는 주소값 비교고 equals는 값 자체를 비교하는검미다

아니면 카운트한 변수 값이 args의 길이와 같으면 종료하는 경우로 바꾸는게 더 좋겠어 식식 분하다!!
****지만... cnt == args.length 면 종료 **...


으아아 하루에 필요한 채팅량을 충족할 수가 없으니까 여기다 많이 씁니다.


--------------------------------------------------


객체를 위한 클래스


객체: 물리적인 공간을 가지고 있는 구체적인 것 - 자동차 같은 거 (실제로 돌아다니는)

근데 자동차를 만들려면 설계도 같은 게 있어야되잖아 -> 그게 클래스 = 그래서 객체는 클래스의 실체!

구래서 클래스 1개로 객체 여러개 가능

마자 그래서 실체 = 객체 = 인스턴스 = instance (영어로 하면 인스턴스 -_-);;) 


붕어빵...으으붕어빵

광어빵

잉어빵

황금잉어빵

우럭빵

대게빵


클래스는 동일한데 객체는 좀 다를 수 있음

ex) 도면은 같아서 내부는 똑같은데 외부는 매우다른 집


클래스: 은행계좌

객체: 나의은행계좌 너의은행계좌 우리의친구의은행계좌


ㅇ예~~~클래스~~


클래스 - 필드랑 메소드가 있음

필드: 변수임 (=인스턴스 변수 = 멤버 변수 ) - 얘 지역변수랑 다른거임 걔는 전체적으로 쓸수가없어...

- 전역변수 같은건데 이름을 그렇게 부르기는 객체지향에서 뭐해서 멤버라고 부름 멤버 변수 필드 인스턴스변수 


메소드: 함수임(=인스턴스메소드 = 멤버메소드) - 얘 일하는애임 

- 얘가 필드를 처리하는 기능임여 - 인스턴스함수 인스턴스메소드 멤버함수 멤버메소드

-메소드 연기랑 별로 상관없겠지 크


객체는 힙 영역에 메모리가 잡힘 - 정신이 혼란스러우니 복습할 것 


1) 클래스를 만들 것

public class Student{

String name;

int rollNo;

}


이래놓고 Student david = new Student(); 일케 쓰면 됩니다.

- 데이비드가 참조 변수임 - 해시코드가 필요함용


뉴! new: 메모리 할당


Student alice = new Student(); 일케 써도 됨 (클래스니까!)

존도 써도 되고 데이빗도 써도 되고 앨리스도 써도 됩니다


//얘들을 보고 참조형타입이라고 부름

이유: 참조값이 들어가니까 

참조값: 해시코드임


//그림이 여캐는 넘 섹시 타입임니다


그리고 클래스마다 파일 하나씩 만드는 편이 좋겠어

Testsample클래스는 Testsample1.java 


하나의 파일에 클래스 여러개 넣으면 

class A{


}


class B{


}

이럴 경우에 파일명을 뭐로 하지 -> 메인 메소드 있는 걸로 해주면 됨미다

B에있으면 B.java

A에있으면 A.java


아 맞아 그리고 B.java로 했을 때 B는 public class로 만들어줘야함.

왜냐면 main문있는 class는 퍼블릭으로 안만들면 접근을 못함 - 넘나구진것


사실 여러 개 클래스 따로 따로 자바파일로 만들면 퍼블릭이고 뭐고 그냥 클래스 이름으로 하면됨 -_-);;


두개 이상 있으면 main문+public 있는 클래스로 하면 됩니다.


클래스 내의 멤버 변수에 수식을 넣으면 왜 처리 결과가 0될까 - 의문 - 아! 이게 메소드군!


오예 2개남음


class Pay{

String name;

int bonbong; 

int tax;

int silsu;

}

요럴 경우에 스트링은 해시코드니까 int 취급해서 int*4 = 16바이트짜리 메모리인것


근뎅 왜 수식은 못넣을까! 내가 못짜나!

아니면 초기화는 못하나...? -ㅅ-);;; // ㅜㅜ아닌데


저렇게 클래스 내가 만들어놓고

Pay david = new Pay(); 하면 객체 하나 만든거임 - d(-_-)b

저러면 david.name 이런 식으로 접근 가능

쟤네들은 데이빗 객체 안의 멤버 변수임 


.으로 그곳에 접근함 흫ㅎㅎㄽㅎㅅㅎ


p1.tax = (int) (p1.bonbong * 0.045 + 0.5); 

조고 왜 캐스팅했냐면 결과값이 실수임미다 -_-+

더블더블



아 메소드가 함수같은 검미다

아 그냥 함수네 ㅋㅋㅋㅋㅋ


메쏘드는 퍼블릭으로 만드러야 합니다


이렇게 생겼음

public int taxCalc(){


}


taxCalc 호출하면 int값을 리턴한다는 얘기신것

그래서 리턴 해줘야됨

그러면 이렇게 생김

public int taxCalc(){

return 0;         //0아니어도 정수값 리턴할 거 쓰면 됨...

}

이거는 함수 줄 때 p1.bonbon 이런 식으로 주면 에러나쉬는것

그러니까 그냥 bonbon(이거 멤버변수 이름)



근데 메소드는 객체 안에 선언을 하기는 하는데 메모리상에 힙 영역에 있는 건 아님


우리의친구 메모리 영역 이름


1. 스택 - 지역변수

2. 힙 - 배열 & 객체

3. 코드 - 이거 메소드(객체의 함수) ㅋㅋㅋㅋ아옿ㅎㅎㅎ 가 있는 공간인데

4. 데이터 - ㅇㅇ이따나옴 머리가아픔


요기 가려면

멤바변수나 객체가 가지고 있는 해시코드로 호출하는거임 ㅋㅋㅋㅋ ;;(-_-);;;


ㅇㅇ 그러니까 객체를 생성해야지만 메소드를 쓸 수 있는데

메쏘드 메소드 메서드


프린트같은 건 리턴값 없어도 되어서 이런건 걍 ㅣㅇ렇게 생김

class void printhaseyo{


}

오 프린트 박으니까 넘나좋네여 ㅋ(-_-)ㅋ

15줄 ->3줄 객체짱짱맨





메소드 하니까 조커 연기가 누구였지

메소드... 디카프리오 ... 잭... 뭔데 잭....잭 잭 ... 잭 잭... 잭 블랙 ...?

그 싸이코 연기 한 배운데 ㅇㄴㅁ안ㅁ아ㅣㅁㄴ히스레저

디카프리오가 점점 닮아가는 얼굴인 배우인데!!!!!

잭 니콜슨

어휴 https://namu.wiki/w/%EC%9E%AD%20%EB%8B%88%EC%BD%9C%EC%8A%A8?from=%EC%9E%AD%20%EB%8B%88%EC%BB%AC%EC%8A%A8




-----------------1시간뒤면 신난당-------------------------~_~


이예~~~ 그리고 인터넷있었음 OTL.... 69017000...

와이파이 ㅠㅠㅠ


그리고 


public int silsuCalc(){

return bonbong - taxCalc();

}

System.out.println("세금: " + taxCalc());


이렇게 바로바로 메소드 내에서 출력할 수 있음

멤바변수는 줄이고 메소드는 늘립시다.


메모리 아끼쉬는것


근데 함수 내에서 응 스캐너도 받을 수 있음 ㅇㅇ //이거 한번 집에 가서 또 짜봐야겠따


next()는 스페이스를 한 단락으로 인식하고 nextLine()는 엔터안 치면 스페이스를 한 단락으로 인식하고 

구래서

public void payinput(){

System.out.print("이름과 본봉을 입력하세요: ");

name = s.next();

bonbong = s.nextInt();

System.out.println("");

}


이렇게 짜면 입력: 김김 23232 했을 떄 엔터 한번에 입력 o


public void payinput(){

System.out.print("이름과 본봉을 입력하세요: ");

name = s.nextLine();

bonbong = s.nextInt();

System.out.println("");

}

}


이렇게 짜면 입력: 김김 2332323 했을때 엔터 한번 치면 이름이 "김김 2332323" 이 됨


-찾아볼 것: 이놈의 커서 맨 끝으로 고정하기-  

  1

 121

12321

 121

  1

이거 짜고 갈 것... 일단 로그오프!




5. 수업

진도: 

hw: 

11문제 풀어볼 것!



6. 할것


나갈때 티스토리 로그아웃 할 것 - 안그러면 집에서 비번 맨날 바꿔야해 짱귀차나 ㅠㅠ...


예쓰! 5일차!

1. 학원에서 제어문 예제 좀 공부할 것. - 값좀 써보면서 짜고 답 맞춰 보기... 씪씪 

2. 쿠페한테 깔아둘 것 - 얘 랜선 연결하는 거 하고 etc 좀 찾아두기 (옆에 정리함에 있을 듯)

3. 우쿨 조율 해놓기

4. 오늘 급하지 않으니 술집 안 나오는 쪽으로 길 찾아두기

5. 학원 (4월부터 시작 하는 것) 알아보기 - 문화원 연계가 되면...

6. 하얀색 옷 좀 살 것 - 으으 검정의 향연...

7. 게임 그 ** 보스좀 잡을 것 - 주말의 목표 -_-)b 왜 한명만... 왜... 

8. 옷장 정리를 할 것 - 뭐가 어디에 있는가 ...

9. windows 로고 + ctrl + d 이거의 친구 & 이거 이름좀 알아볼 것

10. 승질나니까 인강도 듣기 - 스터디데스크.co.kr 아이씨! - 오늘 버그만듬 버그버그 버그! 으아아 ***가 고쳐줌...

11. 머리도 자를래 으으

12. 슬리퍼도 갖다 놓을까 <-... (-_-);;

13. do while 예제 한 5개 만들어보기

14. 마방진으로 하트 만들어보기 (-_-);;;

15. 앜 매물 하나 놓쳤다!! **

16. 집에 가서 샤이닝 다운받아서 봐야지 

'Programming' 카테고리의 다른 글

160322: 7회차  (4) 2016.03.22
160321: 6회차  (1) 2016.03.21
160317: 4회차  (3) 2016.03.17
160316: 3회차  (2) 2016.03.16
160315: 2회차  (1) 2016.03.15
Posted by DAVID

160317: 4회차

Programming 2016. 3. 17. 18:30

1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


오늘 7장 도스창에서 입력받는 것 (editplus로 코딩후 cmd창에서 컴파일하는 거) - 부터 시작


class Hello{

   public static void main(String[] args){

String a = args[0];

String b = args[1];

String c = args[2];

String d = args[3];


System.out.println("args길이: " + args.length);

System.out.println("a: "+a);

System.out.println("b: "+b);

System.out.println("c: "+c);

System.out.println("d: "+d);

}

}


이런 코드인데 만약에 도스창에서 String 입력 받아야 할 때 값을 안 넣으면 java.lang.ArrayIndexOutOfBoundsException 뜸

= 배열의 첨자가 범위를 벗어났다는 뜻이라고 ... -.,-) 이게 값을 안 넣으면 [0]까지만 가리키고 있으니까 [3]까지 접근을 못해서 그럼

그리고 입력 받는 개수는 늘어나도 상관없는데 출력은 4개만 해놓아서 4개까지만 뜸

cmd 창에서 javac 써서 컴파일 하는 건 가끔 하나 보다... :<


String 한글도 됨 -_-)b - 근데 이거 할당 해제가 자동인가 자바는... 메모리 관리를 어떻게 하쥐 (나중에 하겠지뭐...)



Integer 변환하쉬는것 - 중요하신것


public class DosInput2{

public static void main(String[] args){

int i1 = Integer.parseInt(args[0]);

int i2 = Integer.parseInt(args[1]);


System.out.println("args.length : " + args.length);

System.out.println("i1 : " + i1);

System.out.println("i2: :" + i2);

System.out.println("i1 + i2 : :" + (i1+i2));

}


}


Integer.parseInt 할 경우 int 타입이 안 들어가면 java.lang.NumberFormatException 뜸

형식이 틀렸어요 잘하세요 인것 


인티저.파스인트 외울 것 ★ 우리의친구임 


Integer.parsInt - 정수 모양을 가지고 있는 문자열을 정수형으로 변환해주는 메소드 

정수(숫자) 말고 다른 거 입력 못 받으쉬는것

이렇게써요: Integer.parseInt("100") - o


하지마쎄여1: Integer.parseInt(null) -   x 값이없는것

하지마쎄여2: Integer.parseInt("3.15") - x 실수형

하지마쎄여3: Integer.parseInt("a") -    x 문자형


외우시는것

그리고 우리의 외주 친구는 Double.parseDouble 이런 애도 있음 - 얘는 3.15 이런거 사용 가능


오류 메시지 친구 - 널포인트익셉션도 우리의친구임


lectureblue에 Calc 예제 for문에 for(int i = 0; i<args.length;i++)로 수정

하드코딩 너무 불친절합니다.             

java Calc  3212 321 321 321 321 312 312 321 312 321 321 321 312이런 식으로 입력해야 해서 불편함            

한개씩 받아도 계산할 수 있게 해주라고!


main의 args는 보내는 만큼 확장 가능한 배열 넘나 좋은것 - 이아니라 이거 메모리 관리 어떻게 하는 건갓 ㅠㅠ...메모리모리메리모



DecimalFormat: 숫자에 , 넣어줘서 이쁘게 보이는 건데 DecimalFormat이라는 객체(예약어임)를 이용해서 숫자를 넣으면

이건 숫자가 아니라 문자화 되어지는 거임


DecimalFormat 변수 = new DecimalFormat("###,##0"); 같이 사용한다. - 문자열로 취급받음.

결과값은 3,000,000 같이 나온다.

###,##0 == ###,###


//cmd창 복사 : 표시 선택 -> 블록후 오른쪽마우스 클릭 : 복사된것


/*

1. 이름 2. 전화번호 3. 주소 입력받아야함 (전화번호도 문자)

주소의 경우 " "로 입력하면 띄어쓰기 포함


예시: 홍길동 010-9999-9999 "서울시 관악구"

*/


//import java.text.DecimalFormat;


public class Myinfo{

public static void main(String [] args){

// DecimalFormat phone_type = new DecimalFormat("###-###-###");


String name = args[0];

String phone_num = args[1];

String address = args[2];


System.out.println("\n이    름: " + name);

System.out.println("전화번호: " + phone_num);

System.out.println("주    소: " + address);


}//end main



}//end class


데시말포맷으로 숫자 그냥 받아서 010-0000-0000 로 나오게 해보기 - 집 가기 전에 해 볼 것 

//이건 안되는 거십니다 -.,- 데시말 포맷의 separator는 .랑 ,밖에 못쓰나봄...(구졌음) 

https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

숫자를 인용할때 사용하는 포맷이기 때문에 전화번호용인 "-"은 사용 불가능

//하이픈 넣으려면 - http://blog.publisher.name/589 참조 <<-

substr 개념 나올 쯤에 하것지...



이클립스에서 콘솔창 실행하는 것처럼 하려면 

run->run configurations -> (x)=Arguments 의 Program arguments에 값 넣어주면 됩니다.


java.lang 패키지안에 int system 이런애들이 기본적으로 있어서 자동 import인것 - 안 해줘도 compile 할 때 자동으로 해줌

그리고 이클립스 오토 기능 넘나 좋은것


System.in : 자바 표준 입력 장치

System.out: 자바 표준 출력 장치 

- 만약에 system.in 사용해놓고 입력 안 하고 있으면 프로그램 계속 돌고있음...


어쨌든 일은 메소드가 한다 (Scanner의 nextInt라는 메소드 같이)

 

★★★클래스★★★



GradeSwitch

case"A":

case"a":

System.out.println("A");

break;

case"B":

case"b":

System.out.println("B");

break;


OR 처럼 쓰고 싶으면 저렇게 써야 한다.


hasNext(): 다음 입력이 있는지 체크 (다음에 뭐 가져올 게 있나 체크)

스캐너변수.close() : 스캐너 닫았다고 - 이거 하면 전역변수 안해도 exception 안뜸 -_-)b 올ㅋ


////////////////////점심////////////-아 오늘은 6천원 ㅇㅇ//////////


System.in.close(); 를 사용할 때는 try catch문 써야 함 ㅇㅇ

안쓰면 i/o exception 뜹니다

surround with try/catch 문 자동완성이 있음!


ㅇㅇ 08은 파워복붙임 집에 가서 쳐봐야지 :>

오 Math.random() 씀 넘나좋은것

Math 클래스의 random() 메소드 = 난수 생성 메소드 (0~1.0까지라서 *45+1 하면 1~45임(1 안더해주면 0부터 45까지라서 -,.-))

a[i] = (int) (Math.random() * 45 + 1);

요런 식으로 쓰는데 강제로 형변환함

예제는 로또임


--------------------------------------------


<< 자바 실습문제 >> 
 
1. 배열의 저장된 5개의 점수를 생성해서 반복문으로 배열 일관처리로  
   총점을 구한후 평균을 구해서 출력하세요. 
정수를 넣기 +for문써야함 + 배열
 
 
2. 배열의 저장된 5개의 실수를 생성후 최대값과 최소값을 구한후 
   출력하세요. 
실수를 넣기 +  최대값: max / 최소값: min + if문 2개 기본인것
실수형 암거나
 
 
3. 배열에 저장된 5개의 음수, 양수를 절대값을 구해서 
   출력하세요 
음수: 0보다 작을 시 -1을 곱하시는것
 
 
4. 프로그램 실행시 main 인자값으로 본인이 정보(이름, 전화번호, 주소,주민번호)를 입력받아 
   이름, 전화번호, 주소, 나이를 출력하세요.

 
//주민번호에서 나의 태어난 연도 뽑기 
String jumin= args[3]; //921008-2078815 
int iage = Integer.parseInt(jumin.substring(0,2)); //0은 포함 2까지...(-_-);; - 모지이게 순번인가?0번째~1번쨰까지 - 2는안포함
iage += 1900; //1992 
 
//현재년도 알아내기
Calendar calendar = Calendar.getInstance(); 
int currYear= calendar.get(Calendar.YEAR); //아 iage에서 빼면 나이가 나옴입니다 -_-+
 
 
5. 프로그램 실행시 main 인자값으로  숫자 2개를 입력받아서 최대값과 최소값을 구해서 
   출력하세요. 
     //정수이쉰것
 
6. 프로그램 실행시 main 인자값으로 정수를 입력받아서 양수인지, 음수인지, 0인지를  
   판단후 출력하세요. 
    //얘도정수


7.  다음의 코드조각들을 바르게 조합하여 아래 결과값이
    출력되도록 만들어 보세요
   //으아아 매칭ㅇㅇㅇ 이러기야 ㅋㅋㅋ
 
   c:>java Test
 
      0      4
      0      3
      1      4
      1      3
      3      4
      3      3
 
  >>> 코드 조각들
  x++;
  if(x==1){
  System.out.println(x + "" + y);
  class Test{
  for(int y=4; y>2; y--){
  for(int x=0; x<4; x++){
  publc static void main(String[] agrs){



8. 자바의 기본형타입(8가지)과 크기를 byte단위로 명시하세요
 
  예)정수
     int(4byte)
 
  
 
 
9. 문장내에서 continue 문을 쓸수 없는 문장은?
 
 1)  for 문           2) while 문
 3)  do while 문      4) switch문
   
 
 
10. 실행되는 순서를 작성하세요
 
   for(int i=0;i<100;i++){
          [1]  [2]   [3]
 
 
 [4] -실행내용
 
   }
 
 
   예) [2] -> [3] -> [4] -> [1]-> [2] ->[3]
 
 
11. Scanner객체를 이용하여 나의정보(이름, 주소, 생일)를 
    입력받아서 정보(이름,주소,나이)를 출력하는 class를 작성하세요


 

//다풀었음 :< //나이거 스캐너를 이용해서 올렸으니까 도스 프롬프트 쓰는 법 집에서 해봐야함 - 

--------------------------------------------





5. 수업

진도: 

hw: 


6. 잡

집에갈때 체했을 때 먹는 약 사가기 - 맛 안 이상한 비타민제(비타500 아닌 맛)도 생각해 보아요

호박죽도 사가기! - 죽! 죽죽죽죽죽


미에로화이바 몇년만에 먹으니까 맛이 당근주스 같아짐 = 승질나는것

몸이 안좋으니까 하얀 색 입고 잘 것


//http://www.colourpod.com/post/39860655902/bmo-submitted-by-r4ygun-69ae9c-78c4af-92cdbc - 비모

http://www.oeker.net/bbs/board.php?bo_table=designer4&wr_id=186936

FERO한테 과자 보내주기! - 우체국 몇시에 닫더라? 


옆에 타이틀창 확장시 색깔 구리게 나오는 것(회색조) 변경하는 것 찾아내리라 (**)  

1) 왜그럴까: 이거 씨꺼먼색 투명화해서 이상한 색 되는거

2) 왜그럴까: 그냥 저게 파일일까? - 근데 이미지 파일 내에 없음 


ㄴ 아 배경 바꾸는 법은 찾음 ㅇㅇ 쉬움 - 근데 옆에 타이틀창 확장시 변경을 못잡겠음


taskmgr - 이거 작업 관리자 명령어임 -_-)ㅋ


http://www.w3schools.com/html/default.asp

CSS!

http://html-color-codes.info/Korean/

'Programming' 카테고리의 다른 글

160321: 6회차  (1) 2016.03.21
160318: 5일차  (2) 2016.03.18
160316: 3회차  (2) 2016.03.16
160315: 2회차  (1) 2016.03.15
160314: 1회차  (1) 2016.03.14
Posted by DAVID

160316: 3회차

Programming 2016. 3. 16. 18:30

1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것

제어문

분기문 

1. if 

if else

if else if 

IfExam은 else 안쓰고 if문만 사용한 분기문: == (비교할 땐 이걸로. 뜻: 같다)

IfExam2는 if else 문: 별거 없음

IfTest1은 종합세트


2. Switch

Switch - case - break - default

정수형만 사용 가능: byte short int long // char나 String 도 사용 가능하긴 함

Switch(조건식){

case (값):

break;

↓

case (값);

break;


default:

break; //default도 break를 해줘야 빠져나갈 수 있음.

}

switch문의 조건식의 계산결과는 int 범위 이하의 정수만 가능하다. (값 or 상수)

Switch를 이용한 실습예제를 해 보았음 -> Scanner 써봤는데 공부해야할듯 -_-);; import 넘나 어려운것


논리 연산자를 이용한 제어 조건의 이용

|| : 앞의 애가 참이면 뒤의 애를 검사안함 = or연산

&&: 앞의 애가 거짓이면 뒤의 애를 검사안함 = and연산

//괄호 오타 조심하기


반복문

While

-조건 만족후 종료

do-While

-무조건 한번은 실행 (do 구문안에 있는건 한번은 돈다)

do{

~작업문~

}while(조건식) // 조건이 true이면 반복 / false이면 반복 종료 / 조건식 뒤에 뭘 써서 while문처럼 사용은 불가능.

for

for(초기문; 조건식; 반복후작업) { 

~작업문~

}

for(1; 2; 4){

3

} //작업 순서인것

초기문: 초기화 작업을 위해 한번 돌아가는 것

조건식: 논리형 변수나 논리 연산만 가능(i<=10 이런거)

작업문: ㅇㅇ작업문

반복후작업: 조건식->작업문->그담에 반복후작업(완료 안되었으면 다시 조건식 루트)


break; = 자기가 속한 반 복문 벗어날 때 쓰는 것


갑작스런 배열

배열 생성후 변수에는 해시코드가 들어감 

ex) int [] pay = {10, 20}; // pay에 해시코드가 들어감


메모리 

Stack (호출되었다가 사라짐)

지역변수

사용이 끝나면 메모리 할당 해제


Heap (가비지컬렉터에 의해 관리됨)

객체, 배열 

배열의 경우 pay 배열(생성되는 방)의 메모리 주소를 가리키는 해시코드를 pay라는 지역변수가 가지고 있음.

참조하는 변수가 사라질 경우 가비지컬렉터에 의해 메모리 할당 해제

//접근하는 법= 객체 접근: . 배열 접근: [] 

점심먹고 중첩 for문 써보았다.

break문에 label 다는 것도 있긴있음 - ㅇ...goto문 같은거임...label 이름은 변수처럼 내가 지을 수 있음

goouter: for (int i=0; i<=2; i++) {  //저렇게 앞에 선언 

                    for (int j=2; j>=0; j--) { 

                        if (i==j) break goouter; //break문 사용할 때 이 루틴을 종료시킴 

                        System.out.println("i==" + i + " j==" + j); 



break: 루틴을 벗어남

continue: 루틴을 벗어나지 않고 계속 사용함 

  for (int i=0; i<=2; i++) { 

                             //  ┌ continue시 이동되는 곳   

                             //  ↓  

            for (int j=0; j<=2; j++) { 

                if (i==j){ 

                    continue; 

                }else{ 

                    System.out.println("i==" + i + " j==" + j);                     

                }  //사실 이거 else 없애고 그냥 println 해도 나옴

이렇게 자기가 속한 루틴 내의 상위로 가서 돌림    


점심 뒤에 파워 복붙코딩


배열: 크기 변경 불가능

Collection Class: 크기 변경 가능 (이게뭐지)

배열 선언시 

1. int[] intarray 

2. int [] intarray

3. int intarray [] 


1이나 3을 많이 씁니다 - 에이씨! (-_-) 뒤에 써도 맞는 거임

어쨌든 저렇게 선언만 하고 생성을 안하면 아직 해시코드는 없음.

int [] weight = new int[7] 이렇게 하면 28바이트 할당

int weight[] = {100, 200}; 이렇게 하면 그냥 요소가 결정이 되고 값이 할당됨 ㅇㅇ


1차원 배열은 그냥 1차원 배열 같이 생겼습니다 

String [] lang = new String[4];

이렇게 짰을 때

lang[0] = ("JAVA");      ==      lang[0] = new String("JAVA");

-> 배열의 각각 방이 생성되는 객체의 해시코드값을 가지고 있음.


Scanner 써보았다.

import java.util.Scanner; // import java.util.*;

Scanner 변수이름 = new Scanner(System.in);

int(예시) i = 0;

i = 변수이름.nextInt(); 

하면 입력된다.


System.out = 표준 출력장치

System.in = 표준 입력장치

.을 통해서 메소드도 호출 가능. (위에서는 스캐너의 nextInt 메소드를 호출하였다)


갑자기 헷갈려서 - 가로 행 세로 열

[3][2] 3행 2열

이면 

1차원 배열과 동일하게 열 2개를 가리키는 해시코드를 만든 뒤 각자 3행짜리의 해시코드값을 가지고 있음.(혼란)

ar[2] (ar_이가리키는해시코드_)□□

ar[2][3] (ar_이가리키는해시코드_)□□ 같이 생겼는데 얘네가 또 각각 (해시코드_)□□□를 가리키고 있음.

3차원 면-행-렬

2차원 행-렬

1차원 렬


근데 자바는 컬렉션 클래스를 쓰기 때문에 3차원까지 안감 -_-)b ㄴㅁㄴㅁ


Scanner로 입력받을 때 nextInt nextDouble 등으로 타입을 다르게 입력받음...



5. 수업


진도: 

lecture 07 중반

hw: 

System.in의 in은 inputstream,이라서 in.close 이런 식으로 해제하면 메모리 ㅂㅂ 

오예

느낀 점: 앞자리가 모니터가 더 나은 듯 - 상태와 내 집중력이 분산된다고! 으으 -ㅠ-

switch문 범위 설정해서 조건문으로는 못 짜나?

//no else

if(year >= 1){

if(child > 1){

pay = pay + (child * 200000);

}

}

이거 생각해 보기 year의 디폴트는 0임. -> 오 풀었음 -_-)b

switch(year){

case 0:

break;

default:{

switch(child){

case 0:

break;

default:

pay = pay + (child * 200000);

}//end switch_2

}break;

}//end switch_1


그런데 이런 코드를 쓰지 말고 그냥 if를 쓰는 편이 좋겠어 


i++ ++i 이거 개념좀 몇번 더 보기 - 내가 생각하는 거랑 딱 반대가 맞는 거임 이 **

오늘도 xor을 틀렸나이다 ** 우리의 친구 같이 생긴 애임 ^ <<- ^^





System.out.println(System.identityHashCode(변수));

//이렇게 하면 해시코드값 얻을 수 있긴 한데 이걸로 원래 주소값을 찾을 수가 있나






mia blog:

<<집에 가서 할 것>>

1. 위젯 좀 달아보기 (간단한 d-day 카운터) -> 위젯뱅크 문닫음

2. 게임 ... 켜놓고 심플한 디자인좀 빼보기 -.-); - 그냥 있는 거 수정만 하기로 (내 로고 원본 찾기 or 뭐 하나 만들기)

3. ↑ 이거 닉네임 바꾸면 인벤토리 비워야 하나 찾아보기... 설명 다시 보기 - 이건 다시 봐야함 

4. 책에서 몇개 뽑아볼 것 - 워드프레스는 스킵해도 됩니다. - 거의 다 뽑음

프로그램이나 쓸만한 기능 적어두기 - 메타블로그는 넘겨도 됩니다.

<<넘겨도 되는 것>>

애드센스

메타블로그 

다음뷰

블로그코리아

올블로그

믹시

올포스트


<<적어보는 것>>

RSS

피드버너

구글 분석

윈도우 라이브 에센셜: 어 이건 저장용으로 쓸까 생각중 


유디엠

ㅋㅋㅋㅋ육아용 lilypie.com <- 육아용 dday 밖에 없는거신가 

http://www.timeanddate.com/clocks/freecountdown.html

두개 중에 하나 쓸 것

http://onlineclock.net/ 이것도 되는 거임

오! picpick.org 오 된당 - 색삭 추출 도구 제공


<<해야할 것 같은 느낌>>

Thinktank에 적은 것


오늘도 역시 책은 내도 됩니다. // 지하철에 가면서 좀 더 읽고 색상표좀 빌려오기!

주말에 우쿨 or html&css 보기 


5. 위가 아프니까 집에서 밥을 먹을 것... 라면 x...

그리고 주변 신경 쓰지 말고 공부를 하기 -_-)! 으으으


'Programming' 카테고리의 다른 글

160321: 6회차  (1) 2016.03.21
160318: 5일차  (2) 2016.03.18
160317: 4회차  (3) 2016.03.17
160315: 2회차  (1) 2016.03.15
160314: 1회차  (1) 2016.03.14
Posted by DAVID
이전페이지 다음페이지
블로그 이미지

by DAVID

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • 더 보기

태그

글 보관함

«   2016/03   »
일 월 화 수 목 금 토
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

링크

카테고리

PC (112)
Programming (109)

카운터

Total
Today
Yesterday
방명록 : 관리자 : 글쓰기
DAVID's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

PC

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • PC (112)
    • Programming (109)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바