변수의 스코프

프로그램상에서 사용되는 변수들은 사용 가능한 범위를 가진다. 그 범위를 변수의 스코프라고 한다.

변수가 선언된 블럭이 그 변수의 사용범위이다.

    public class ValableScopeExam{

        int globalScope = 10;   //클래스 변수 

        public void scopeTest(int value){   
            int localScope = 10;
            System.out.println(globalScope);
            System.out.println(localScpe);
            System.out.println(value);
        }
    }
  • 클래스의 속성으로 선언된 변수 globalScope 의 사용 범위는 클래스 전체 이다.
  • 매개변수로 선언된 int value 는 블럭 바깥에 존재하기는 하지만, 메서드 선언부에 존재하므로 사용범위는 해당 메소드 블럭내이다.
  • 메소드 블럭내에서 선언된 localScope 변수의 사용범위는 메소드 블럭내이다.
main메소드에서 사용하기
  • 같은 클래스 안에 있는데 globalScope 변수를 사용 할 수 없다.
  • main은 static한 메소드이다. static한 메서드에서는 static 하지 않은 필드를 사용 할 수 없다.
    public class VariableScopeExam {
        int globalScope = 10; 

        public void scopeTest(int value){
            int localScope = 20;            
            System.out.println(globalScope);
            System.out.println(localScope);
            System.out.println(value);
        }   
        public static void main(String[] args) {
            System.out.println(globalScope);  //오류
            System.out.println(localScope);   //오류
            System.out.println(value);        //오류  
        }   
    }
static
  • 같은 클래스 내에 있음에도 해당 변수들을 사용할 수 없다.
  • main 메소드는 static 이라는 키워드로 메소드가 정의되어 있다. 이런 메서드를 static 한 메소드 라고 한다.
  • static한 필드(필드 앞에 static 키워드를 붙힘)나, static한 메소드는 Class가 인스턴스화 되지 않아도 사용할 수 있다.
    public class VariableScopeExam {
        int globalScope = 10; 
        static int staticVal = 7;

        public void scopeTest(int value){
            int localScope = 20;        
        }

        public static void main(String[] args) {
            System.out.println(staticVal);      //사용가능 
        }

    }
static한 변수는 공유된다.
  • static하게 선언된 변수는 값을 저장할 수 있는 공간이 하나만 생성된다. 그러므로, 인스턴스가 여러개 생성되도 static한 변수는 하나다.
    ValableScopeExam v1 = new ValableScopeExam();
    ValableScopeExam v2 = new ValableScopeExam();
    v1.golbalScope = 20;
    v2.golbalScope = 30; 

    System.out.println(v1.golbalScope);  //20 이 출력된다. 
    System.out.println(v2.golbalScope);  //30이 출력된다. 

    v1.staticVal = 10;
    v2.staticVal = 20; 

    System.out.println(v1.statVal);  //20 이 출력된다. 
    System.out.println(v2.statVal);  //20 이 출력된다. 
  • golbalScope같은 변수(필드)는 인스턴스가 생성될때 생성되기때문에 인스턴스 변수라고 한다.
  • staticVal같은 static한 필드를 클래스 변수라고 한다.
  • 클래스 변수는 레퍼런스.변수명 하고 사용하기 보다는 클래스명.변수명 으로 사용하는것이 더 바람직하다고 하다.


'Java > 자바 공부' 카테고리의 다른 글

super() 와 부모  (0) 2018.01.20
오버로딩과 오버라이딩  (0) 2018.01.20
1-1 TCP Server 와 Client  (0) 2018.01.18
log 파일 분석 > 중복된 ip를 제거하고 출력하는 방법  (0) 2018.01.18
자료구조  (0) 2018.01.18


**Socket 클래스 - 다른 컴퓨터와 연결하기 위한 클래스 


[생성자]

Soket() : 일반 소켓을 만들 때 사용하는 생성자 

Socket(InetAddress addr, int port) : addr 주소의 port에 접속하기 위한 소켓을 생성 

Socket(String addr, int port ) : addr 주소의 port에 접속하기 위한 소켓을 생성 - 주소를 문자열로 대입

Socket(InetAddress addr, int port ,InetAddress localAddr, int localPort) : addr 주소의 port에 접속하기 위한 소켓을 생성하는데 자신의 주소를 localAddr의 localPort로 설정해서 연결 


[ 메소드 ] 

void close() 소켓닫기 

IntputStream getInPutStream() : 상대방으로 데이터를 읽어 오기 위한 스트림을 만들어주는 메소드 


OutputStream getOutputStream () : 상대방에게 데이터를 보내기 위한 스크림을 만들어주는 메소드 

InetAddress getInetAddress() : 연결된 상대방의 주소 정보를 리턴하는 메소드 

int getPort() : 연결된 상대방의 포트 정보를 리턴하는 메소드 



**TCP 통신 


=> 항상 구동 중인 서버와 클라이언트 간의 통신 


[서버]


=> SocketServer 클래스의 생성자를 이용해서 서버를 생성하는데 이 때 포트번호를 설정할 수 있고, 접속 개수를 제한 할 수 있습니다. 

=>Socket accept ()를 호출해서 클라이언트의 접속을 대기합니다. 

클라이언트가 접속하면 클라이언트와 통신할 수 있는 Socket이 리턴됩니다. 


[ 클라이언트 ] 


=> Socket 클래스의 객체를 생성할 때, 서버의 Ip주소와 포트 번호를 설정해서 접속하면 됩니다. 



Socket -  프로세스간의 통신을 담당합니다. InputStreamOutputStream을 가지고 있다.  Input과 Output 스트림을 이용해서 프로세스간의 통신이 이루어집니다. 


ServerSocket  - 포트와 연결되어 대기 상태에 있다가 연결 요청이 들어오면, SocKet을 만들어서 서로간의 통신을 이루어지도록해줍니다. 




[ Tcp 연결방식]

연결기반 (connection - oriented)

-연결 후 통신(전화기 

1:1 통신방식 


[Tcp 특징]


- 데이터의 경계를 구분안함 Byte-stream

- 데이터의 전송 순서가 보장됨 

- 데이터의 수신여부를 확인하고 요청에 대해 클라이언트나 서버가 요청과 수락을 반복함 

- 신뢰성있는 데이터 전송 





package networkfolder;


import java.io.BufferedReader;


import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;


public class TCPserver {


public static void main(String[] args) {

// 서버는 서버 소켓과 클라이언트 소켓 2개가 필요

while (true) {

// 클라이언트의 요청을 받기 위한 소켓

ServerSocket serverSocket = null;

// 클라이언트와 통신을 하기 위한 소켓

Socket socket = null;


try {


serverSocket = new ServerSocket(15654);


// 클라이언트의 요청을 받을 수 있도록 포트를 갱방


System.out.println("서버 대기 중 .... ");


// 서버가 클라이언트의 접속을 대기

// 대기 시간은 클라이언트가 접속할 때 까지

// 통신은 소켓을 가지고 함

socket = serverSocket.accept();


// 전송되어온 데이터를 읽기 위한 스트림을 생성

// InputStreamReader 를 사용한 이유는 byte 기반의 스트림을 문자열로 변환을 해주기 때문이다.

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// 한줄의 메시지를 읽어서 msg에 저장

String msg = br.readLine();


// 메시지를 전송하기 위한 스트림을 생성

PrintWriter pw = new PrintWriter(socket.getOutputStream());

// 메시지를 전송

pw.print("서버가 보내는 메시지 : ");

pw.close();

// 클라이언트한테 받은 메시지 출력

System.out.println("클라이언트 메시지 : " + msg);


// 스트림닫기

br.close();

pw.close();


} catch (Exception e) {

System.out.println("예외" + e.getMessage());

}


finally {

try {

if (serverSocket != null) {

serverSocket.close();

}

if (socket != null) {

socket.close();

}

} catch (Exception e) {

System.out.println("예외" + e.getMessage());

}

}

}

}

}



// 클라이언트 

public class TCPClient {


public static void main(String[] args) {

// 클라이언트는 서버와 통신할 소켓 1개만 있으면 됩니다.

while(true) {

Socket socket = null;


try {


// 접속할 서버의 주소를 생성

InetAddress addr = InetAddress.getByName("127.0.0.1");


// socket = new Socket()주소와 포트번호

// 서버에 접속

socket = new Socket(addr, 15654);

Scanner sc = new Scanner(System.in);


// 서버에게 메시지를 전송


PrintWriter pw = new PrintWriter(socket.getOutputStream());

String str = sc.nextLine();

pw.println(str);

pw.flush();


// 서버에서 온 메시지를 읽어서 출력하기

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String msg = br.readLine();

System.out.println("클라이언트에서 보내는 메세지 ");


// 스트림닫기

pw.close();

br.close();


} catch (Exception e) {

System.out.println("예외" + e.getMessage());

} finally {

try {


if (socket != null) {

socket.close();

}

} catch (Exception e) {

System.out.println("예외" + e.getMessage());

}

}

}

}


}


log 파일 분석 





log.txt



package log;


import java.io.BufferedReader;

import java.io.FileReader;

import java.util.HashSet;


public class Logmain2 {


public static void main(String[] args) {


// log.txt file의 내용을 읽을 수 있는 객체를 생성

// log. txt 파일은 문자열로 구성된 파일이므로 읽기 위한 클래스는

// BufferedReader를 사용하는 것이 좋습니다.


try (BufferedReader br = new BufferedReader(new FileReader("log\\log.txt"))) {

// try()안에 객체를 생성하면 close()를 하지 않아도 됩니다.


// 텍스트 파일의 내용을 전부 읽어서 출력하기

// BufferedReader 객체에는 readLine()이라는 메소드가 있는데

// 줄 단위로 데이터를 읽고 읽은 내용을 String으로 리턴합니다.

// 마지막 줄에 가서 더이상 데이터를 읽지 못하면 null 을 리턴

HashSet<String> hs = new HashSet<String>();

int sum =0;

while (true) {

String b = br.readLine();

if (b == null) {

break;

}


// b중에 공백을 기준으로 맨 앞의 데이터만 출력

// 특정한 문자나 문자열을 기준으로 분할 해주는 메소드

// split(구분자) - String [] 로 리턴합니다.

String[] ar = b.split(" ");

//ar 9번의 값을 출력 

String a = ar[ar.length-1];

int trafic =Integer.parseInt(a);

sum =sum+trafic;

//중복된 ip를 제거 하고 출력 

hs.add(ar[0]);

}

//중복된 Ip없이 출력 

for(String temp : hs) {

System.out.println(temp);

}

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

//트랙픽의 합계 출력 

System.out.println("트래픽의 합은 : "+sum);


} catch (Exception e) {

System.out.println("예외" + e.getMessage());

e.printStackTrace();

}


}


}


 

 데이터  n개 

 

배열, List - 비교가능 

set - 비교가능, 중복없이 

Map, DTO 클래스 -비교 불가능 

 

Map은 중복제거 된다.

log.txt




1) Map의 특징 

=> key 와 Value를 쌍으로 저장하는 자료구

=> 중복된 Key는 저장될 수 없어서 동일한 Key에 데이터를 삽입하면 수정이 발생합니다. 

=> 메소드 

=> Object 자료형은 형변환 해주어야한다. 

=> Object get(key)  : key에 해당하는 value리턴 없으면 null을 리턴 

=> void put(key, value) : key에 Value 저장

=> set keyset :  Map의 모든 key를 Set으로 리턴 



package log;


import java.io.BufferedReader;

import java.io.FileReader;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Map;

import java.util.Set;


public class LoMain4 {


public static void main(String[] args) {


// log.txt file의 내용을 읽을 수 있는 객체를 생성

// log. txt 파일은 문자열로 구성된 파일이므로 읽기 위한 클래스는

// BufferedReader를 사용하는 것이 좋습니다.



    try (BufferedReader br = new BufferedReader(new FileReader("log\\log.txt"))) {

// try()안에 객체를 생성하면 close()를 하지 않아도 됩니다.


// 텍스트 파일의 내용을 전부 읽어서 출력하기

// BufferedReader 객체에는 readLine()이라는 메소드가 있는데

// 줄 단위로 데이터를 읽고 읽은 내용을 String으로 리턴합니다.

// 마지막 줄에 가서 더이상 데이터를 읽지 못하면 null 을 리턴

// Ip별 트래픽 합계

Map<String, Object> map = new HashMap<String, Object>();

   while (true) {


String b = br.readLine();

if (b == null) {

break;

}


// b중에 공백을 기준으로 맨 앞의 데이터만 출력

// 특정한 문자나 문자열을 기준으로 분할 해주는 메소드

// split(구분자) - String [] 로 리턴합니다.

String[] ar = b.split(" ");


// Ip를 가져와서 ip에 저장

Object temp = map.get(ar[0]);

// Ip의 key값이 있나 확인해보고 

    // 값은 key가없으면 ip와 traffice을 저장


if (temp == null) {

map.put(ar[0], Integer.parseInt(ar[9]));

}

// 이미 존재하는 IP라면 Traffice에 추가해서 저장

   

else {

// 중복되기 때문에 있는 값을 가져옴

// Object get(key)  : key에 해당하는 value리턴 없으면 null을 리턴


int value = (Integer) map.get(ar[0]);

// 맵은 중복되면 값을 대체 합니다. 

// 그렇기 때문에 이미 저장된 값을 value에 저장하고

// 트래픽이 있는 ar[9]번째를 정수로 바꾸어서 합해준다.

value = value + Integer.parseInt(ar[9]);

// 다시 입력.

map.put(ar[0], value);

}


}

//맵의 모든 데이터 출력 

Set<String>keys = map.keySet();

for(String key: keys) {

System.out.println(key + ": "+ map.get(key));

}


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


} catch (Exception e) {

System.out.println("예외" + e.getMessage());

e.printStackTrace();

}


}


}





[메인 ]


public class Main {


public static void main(String[] args) {

new LottoNumber();

}


}






[랜덤번호뽑기]


public class Ran {


private int ran;


// 랜덤한 숫자를 출력할 1-45까지 출력

public int random() {


double ran = Math.random();

ran = ((ran * 100) % 45) + 1;

// ran에 값을 출력하시고

// ran이 0.5가 나왔을 때


return (int) ran;

}


public int getRan() {

return ran;

}


}





[Frame ]

package Random;


import java.awt.Button;

import java.awt.Frame;

import java.awt.Panel;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.HashSet;

import java.util.Set;



public class LottoNumber extends Frame {

Set<Integer> b = new HashSet<Integer>();

public LottoNumber() {

ArrayList_output sa = new ArrayList_output();

setTitle("나의 첫 로또번호");

// 버튼 인스턴스

Button btn = new Button("번호 뽑기 ");

Button btn2 = new Button("출력");

// 패널 인스턴스

Panel pa = new Panel();

// 패널에 버튼 추가

pa.add("center", btn);

pa.add("center", btn2);

// pa 추가

add(pa);


// 이벤트 버튼

class ClassBtnLotto implements ActionListener {


@Override

public void actionPerformed(ActionEvent e) {

b =sa.addArray();

System.out.println("이벤트 " +b);

}


}

// 이벤트 버튼

ClassBtnLotto select = new ClassBtnLotto();

btn.addActionListener(select);


// 이벤트 버튼 2

class ClassBtnLotto2 implements ActionListener {


@Override

public void actionPerformed(ActionEvent e) {

System.out.println("눌렸는가");

for(Object is : b) {

System.out.println(is);

}


}


}

// 이벤트 버튼

ClassBtnLotto2 select2 = new ClassBtnLotto2();

btn2.addActionListener(select2);


// 화면 보여주기

setVisible(true);

setBounds(400, 400, 400, 400);

}

}





[랜덤한 숫자를 뽑아서 하나씩 값을 추가 ]

package Random;


import java.util.ArrayList;

import java.util.HashSet;

import java.util.Set;



public class ArrayList_output {

// 6번을 넘기지 않을 변수

private int a;


// 배열값을 저장하기 위한 메소드

Set<Integer> ar = new HashSet<Integer>();


public Set addArray() {

// 랜덤인스턴스 호출

Ran r = new Ran();

// 랜덤숫자를 받아온다.

int a = r.random();

ar.add(a);

System.out.println(a + "번호를 뽑았습니다.");


return ar;

}

}











마지막 출력부분이 쓰이지 못하고 BufferedOutputStream의 버퍼에 남아 있는 채로 프로그램이 종료될수 있습니다.

그래서 flsush()나 Close()를 호출해서 마지막에 버퍼에 있는 모든 내용이 출력소스에 출력되도록해야합니다





출처 :위키백과

컴퓨팅에서, 버퍼(완충기억기)는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역이다. 

버퍼링(buffering)이란 버퍼를 활용하는 방식 또는 버퍼를 채우는 동작을 말한다. 다른 말로 '큐(Queue)'라고도 표현한다.

버퍼는 컴퓨터 안의 프로세스 사이에서 데이터를 이동시킬 때 사용된다. 보통 데이터는 키보드와 같은 입력 장치로부터 받거나 프린터와 같은 출력 장치로 내보낼 때 버퍼 안에 저장된다. 이는 전자 통신의 버퍼와 비유할 수 있다. 버퍼는 하드웨어나 소프트웨어에 추가될 수 있지만 버퍼는 상당수가 소프트웨어에 추가된다. 버퍼는 보통 속도가 계속 바뀔 수 있으므로 데이터 수신, 처리 속도에 차이가 있다. (예: 프린터 스풀러)

버퍼는 네트워크 상에서 자료를 주고 받을 때나 스피커에 소리를 재생할 때, 또는 디스크 드라이브와 같은 하드웨어의 입출력을 결합하는 데에 자주 이용된다. 버퍼는 또한 순서대로 데이터를 출력하는 FIFO 방식에서 보통 사용된다.



'Java > 자바 공부' 카테고리의 다른 글

Awt를 이용한 로또번호 만들기  (0) 2018.01.18
버퍼사용시 주의사항 &&  (0) 2018.01.17
Stream Close() 설명  (0) 2018.01.17
0)Stream에 대한 정의  (0) 2018.01.17
1-4) ChractorStream의 Writed와 Read  (0) 2018.01.17

+ Recent posts