Processing math: 100%
728x90

14. 내장 객체 (Built-in Object)

1) 객체 생성
변수명 = new 생성함수();

2) Date 객체
: 날짜나 시간 관련 정보 필요할 때 사용

#1. 객체 생성
변수 = new Date(); 
변수 = new Date("연/월/일");  문자열
변수 = new Date(연, 월-1, 일, (시간, 분, 초, 밀리초 등 더 쓸 수 있다)); 

#2. 메서드

- 정보 가져오기
getFullYear()  : 연도 정보
getMonth()     : 월 정보 ( 0월~11월) 
getDate() : 일 정보
getDay() : 요일 (일:0~ 토:6)
getHour() : 시간정보
getMinutes() : 분
getSeconds() : 초
getMilliseconds() : 밀리초
getTime() : 1970.1.0.0.0부터 경과된 시간을 밀리초로 리턴

- 정보 수집
setFullYear()  : 연도 수정
setMonth()     : 월 수정 ( 0월~11월) 
setDate() : 일 수정
- : 요일은 날짜 바꾸면 자동으로 바뀜 (일:0~ 토:6)
setHour() : 시간정보 수정
setMinutes() : 분 수정
setSeconds() : 초 수정
setMilliseconds() : 밀리초 수정
setTime() : 1970.1.0.0.0부터 경과된 시간을 밀리초로 수정

3) Math 객체
수학 관련 기능과 속성을 제공하는 객체

Math.상수
Math.메서드()

4) Array 객체 : https://itcreator.tistory.com/36
5) String 객체
: 문자형 데이터를 취급하는 객체

변수 = "문자열"; 변수 = '문자열';
변수 = new String("문자열");

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script> // 14-2 ~ 3설명
            let today = new Date();
            console.log(today);
        
            //let christmas = new Date("2022-12-25"); 값 동일
            let christmas = new Date("2022/12/25"); 
            console.log(christmas);
        
            let offday = new Date(2022, 6, 6); //7월 6일
            console.log(offday);
        
            // 메서드
            let month = today.getMonth(); // -1 해서 줌
            console.log(month+1);
        
            let day = today.getDay();
            console.log(day);
        
            let date = today.getDate();
            console.log(date);
        
            let time = today.getTime();
            console.log(time);
            console.log(christmas);
        
            christmas.setFullYear(2023);  // 년도 수정
            console.log(christmas);
        
            christmas.setDate(24);      // 날짜 수정
            console.log(christmas);
        
        
            //14-3 Math
          //  let rd = parseInt(Math.random()*10); / 0~9 사이값 
         //   console.log(rd*100);
        
            // 14-5 String
            let str = "hello javascript"
            console.log(str.charAt(0)); // h 가져옴
            console.log(str.indexOf('j')); //6 (띄워쓰기도 문자)
            console.log(str.match("hello")); // 같은 문자열이 있나?
            console.log(str.substr(3, 5)); // lo ja (시작인덱스, 글자수)
            console.log(str.substring(3, 5)); // lo (시작인덱스, 끝인덱스):끝인덱스 전까지 
            console.log(str.replace("hello","awesome")); //awesome javascript
            console.log(str.split(" ")); //['hello', 'javascript']
    </script>
</body>
</html>
728x90
728x90

13. 자바스크립트 객체
: 프로퍼티와 메서드로 이루어짐 
프로퍼티(변수의 일종) : 프로퍼티(키)와 프로퍼티값(value)로 구성
프로퍼티키는 일반적으로 문자로 구성하고 값은 원하는 값
메서드 : 객체 안에 있는 함수를 가르킴

   
HTML 태그 속성(attribute)과 속성값을 가진다
CSS  프로퍼티와 프로퍼티값
JavaScript  프로퍼티와 프로퍼티값, 그리고 메서드로 이루어짐




1) 사용자 객체 
JS 객체 생성 방법
#1. 객체 리터럴 방식 : 객체 구분 기호 : {}
변수 = {
프로퍼티명 : 값, 
프로퍼티명 : 값,.....
};
객체 자체의 주소값이 바뀌어야만 let으로 변수에 담고
객체 자체의 주소값은 안바뀌고 안에만 바꾼다면 const 변수에 주로 담음

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
   <script>  //13 객체 리터럴 방식
            const user= {name :"pika",age : 10}; // , 을 통해 객체구나 생각!
            console.log(user);
            console.log(user.age);
            console.log(user.name);
       
            console.log(user.test); // 없는 프로퍼티 읽으려하면 undefined 리턴함.
       
       
            // 빈 객체 만들기
            const obj = {};
    //   자바로 치자면 class test {}
    //   obj = new test {}
    
            // 프로퍼티 추가, 삭제  (자바에서 hashmap이랑 비슷함)
       obj.addr = "서울시 서초구";
       console.log(obj);
       delete obj.addr;
       console.log(obj);
       
            // in 연산자로 프로퍼티 있는지 확인
       console.log("name" in user);  //true 출력
       console.log("test" in user);  // false 출력
       console.log("toString" in user);  // true 출력
       
    </script>
    
</body>
</html>

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
    <script>
            // 13. 리터럴 객체  (익명함수)
                let person = {
                    name : "pika",
                    age : 10,
                    getData : function(){
                        console.log("hello method");
                    }, 
                    test : {a: 10, b : "haha", c : [1,2,3,4], d : function(abc){}}
                };
    
            console.log(person);
            console.log(person.age); //변수 출력
            person.getData(); // 메서드 호출
            
        console.log(person.test.a);
        // 3 출력
        console.log(person.test.c[2]);
        console.log(person.test.d(10));
        
            // 프로퍼티 (변수) 추가 : 없는 이름의 프로퍼티명에 값대입
        person.height = 170;
            // 메서드 추가 : 없는 이름의 프로퍼티명에 익명함수 대입
        person.getSum = function(a,b){
            return a + b;
        };
        console.log(person);
        console.log(person.height);
        console.log(person.getSum(10,20));
        
    </script>  
</body>
</html>

 


#2. new Object()로 생성하는 방식
const 변수 = new Object();
변수.age = 10;
변수.name = "hello";

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>    // 13- 2 new object로 객체생성
                    const person = new Object();
                    person.name = "pikapika";
                    person.age = 100;
                    person.getNum = function(){
                        console.log("getNum 메서드호출");
                        return "haha";
                    };
                
                    console.log(person);
                    let result = person.getNum();
                    console.log(result);
 
    </script>
</body>
</html>



#3. 생성자 함수로 생성하는 방식
# 생성자 정의
fuction 생성자명(){ // 생성자명은 첫글자 대문자
....
}
# 객체 생성해서 사용
const 변수 = new 생성자명();
변수.~~~~~
#4. ES6와 클래스

class 클래스명 { // 클래스명 첫글자 대문자
constructor(){// 생성자
....
}
}

const 변수 = new 클래스명();

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
       <script> // 13 -3 
          /*  function Person(name, age){  //대문자
                console.log("Person 객체생성");
                this.name = name;
                this.age = age;
            }
        
            const pika = new Person("pika", 10);
           console.log(pika);
           
          */
                // 13 -4
            class Person{
                constructor(name){
                    console.log("hello");
                    this.name = name;
                }
            }
           class Student extends Person{
               constructor(name, age){
                   super(name);
                   this.age = age;
               }
           }
           
           //const p = new Person("pika");
           // console.log(p);
           
            const stu = new Student("kobugi", 100);
            console.log(stu);
    </script>
    
</body>
</html>

 

728x90
728x90

12. 자바스크립트 변수 선언 방식
: 변수 선언 방식에는 var / let / const 와 같이 3가지로 선언 가능 (ES6부터 가능)
-> 변수 이름 충돌로 인하여...


ECMAScript ES6 = ECMAScript 표준의 6번째 에디션 (2015)

* 블록스코프 : {} if, for, function
함수스코프 : 블록스코프 중 함수 범위를 갖는 스코프

1) var  : 함수스코프 : 같은 이름의 변수 재선언 가능.  (var a = 10; var a = 20; 이렇게 선언가능)
2) let  : 블록스코프 : 같은 이름의 변수 재선언 불가능. 값수정 가능 (자바와 동일)
3) const: 블록스코프 : 재선언 불가능. 값수정 불가능 -> 상수
const는 선언과 동시에 값을 할당해야함. 아니면 에러 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
    <script>  //12 자바 변수
        //var
        /*var name = "피카츄";
        console.log(name);
    
        var name = "꼬부기";
        console.log(name);
        */
        
        //let
     /*   let name =  "피카츄";
        console.log(name);
        
        let name = "꼬부기";  //실행 불가
        console.log(name);
       
        name = "haha"
        console.log(name);   // 수정가능
        */
        
        //const
        const name = "피카츄"
        console.log(name);
        
      //  const name = "꼬부기" // 실행 불가
       // console.log(name);
        
        name = "sdsdf"   // 수정 불가
        console.log(name);
        
          var a;
         var b;
         const c = a;
         
    </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
    <script>
        /*
            // var 함수 스코프
            var foo = "문자문자"
            if(typeof foo == "String"){
                var result = true;
            }else{
                var result = false;
            }
            
            console.log(result); //true 나옴 (사용가능)
        */
        
            var foo = "문자문자"
            if(typeof foo == "String"){
                let result = true;   //
            }else{
                let result = false;
            }
            
            console.log(result); // 에러뜸 ( 사용불가)
    
    </script>
    
</body>
</html>
728x90
728x90

11. 함수 리터럴과 익명함수
1) 리터럴
: 자바 스크립트에서 데이터를 만드는 방법은 크게 두가지로,
리터럴 방식과 객체 방식 두가지가 있다.


타입 리터럴 방식  
숫자  var num=10;  var num = new Number(10);
문자 var name="abc" var name = new String("abc");
불린 var play= true; var play = new Boolean(true);
배열  var arr=[1,2,3];  var arr = new Array(1,2,3);


2) 함수 리터럴
: 함수 이름을 주지 않고 만들면 됨.

#1. 일반적인 방법
function hello(){
.....
}

#2. *리터럴*
var hello = function(name){
....
}
#3. 객체방식(잘안씀)
var hello = new function("name","실행할 명령문들");

3) 익명함수
: 리터럴 방식의 함수를 익명함수라 한다.
호이스팅 불가능
일반함수 : 재사용 많이   할 경우 
익명함수 : 재사용 비중이 적거나, 값처럼 정의해서 넘겨줘야할 경우

익명 함수 활용 전  익명 함수 활용 후
function hello(){
    alert("안녕하세요");
}
$("#btn").click(hello);
$("#btn").click(function(){
    alert("안녕하세요");
});

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    
    <button id="btn">클릭</button>
    <script>
        // 리터럴
        var hello = function(name) {
            console.log(name + "님 배고프신가요?");
        }
        
        hello("토피"); 
        
        // 익명함수 
        $(document).ready(function(){
            $("#btn").click(function(){
                alert("안녕하세요");
            });        
        }); 
   
    </script>
    
</body>
</html>

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
    <script>
        //console.log(a);
    
        //a = 10;  // 전역변수로 선언+대입 해줌 
        //console.log(a);
    
        var a = "global";
        
        function f() {
            a = "local"; // 함수 안에서 var 생략하면 전역으로 선언됨.
            console.log("f : " + a);
        }
        f(); 

        console.log(a);
        
    </script>
     
</body>
</html>

728x90
728x90

10. 함수
1) 함수 function  //자바에서는 메서드와 같은 역할
특성 기능을 하는 코드들을 묶어서 독립된 부품으로 만들어 재사용하고자 할때
호출하여 사용하는 기능

2) 구조 
# 정의(매개변수x, 리턴 x)
function 함수명(){
//실행코드들...
}
#호출
함수명();

# 정의(매개변수O, 리턴 x)
function 함수명(변수명, 변수명,....){
//실행코드들...
return 값;
}
#호출
변수 = 함수명(인자,인자,...);

 

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
   <script>
        // 함수정의
        function test(){
            document.write("hello <br/>");
            document.write("hello <br/>");
            document.write("hello <br/>");
            
        }
        // 함수 실행
       test();
        
        function test2(name, age){
            document.write("당신의 이름은" + name + "이고, 나이는 "+ age + "살 입니다");
            }
       test2("피카츄",20);
       test2("홀길동",100);

    </script>
    
</body>
</html>

 

 

 


3) 스코프
   : 변수 또는 함수의 유효범위 말함

            #1. 전역 변수 Global Variable
선언위치 : 함수밖, {}밖
사용범위 : 자바스크립트 전체 영역

             #2. 지역 변수 Local Variable
선언위치 : 함수안 
사용범위 : 함수안

* 함수 내에서 동일 이름의 변수에 대한 우선순위 : 지역 > 전역

            #3. 전역 함수
전역변수와 동일

             #4. 지역 함수
정의 위치 : 함수안
사용 범위 : 정의된 함수를 품고 있는 함수안

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
    </title>
</head>
<body>
    
    <script>
        var num = 10; // 전역변수
        console.log(num);
        
        function test(){
            console.log("function : " + num); // 전역 num 10출력
             num = 20; //함수안에서 var 생략하면 전역으로 선언됨;
            
            //var num = 20; //지역변수
           
            console.log("function : " + num); //지역변수 20 나옴
            
            //var num = 100; //지역
            //console.log("function : " + num);
        }
    
       // test()  //실행시 16번째 num 이 실행되어 전역변수로 20이 선언됨
        
        console.log(num);  
    </script>
    
</body>
</html>

 

 

 

test() 실행시 전역변수 값이 바뀜

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
   <script>
       // 전역함수
       function func(){
            console.log("전역함수!!");
        }
        
       //전역
    function outerFunc(){
        //지역
        function innerFunc(){
            console.log("")
        }
        
        innerFunc();
    }
    func();
    outerFunc;   
    // innerFunc; 실행안됨    
    
    </script>
    
</body>
</html>


4) 변수에 함수 저장하기
:자바스크립트에서는 함수도 변수에 저장가능.
변수에 함수를 저장하면 변수 이름을 함수처럼 사용할 수 있다.

var 변수명 = 함수명;
-> 변수명();

 

5) 매개변수 값으로 함수 사용하기
: 매개변수도 변수이기 때문에 함수를 담을 수 있다.

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
    </title>
</head>
<body>
    <script>
        /* 함수를 변수에 담을 수 있다.
        function hello(name){
            console.log("hellooo"+ name);
        }
        hello("김김김");
            var func = hello;
        func("피카츄");
        */
         
        // 함수를 매개변수에 담을 수 있다.
        function hello1(){
            console.log("hello!!!");
        }
        function hello2(){
            console.log("hello22222");
        }
        //매개변수를 함수로 실행하는 함수
      //중요
        function execute(func){
            func();
        }
        execute(hello1);
        execute(hello2);
    
    </script>
    
</body>
</html>




6) 리턴값으로 함수 사용하기
: 함수는 어떤 값이든 리턴가능. 즉, 함수를 리턴할 수도 있다.

 

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
   <script>  // 10-6 설명
    function getHello(){
        function hello(user){
            console.log(user + "님 방문을 환영합니다.");
        }
        return hello;  // 함수 이름을 리턴 
    }
    var result = getHello(); // 힘수를 리턴받아 변수에 저장
       result();
       result("홍길동");
    
    </script>
    
</body>
</html>

728x90
728x90

9. 배열 array
: 다양한 데이터 타입의 값 저장 가능

1) 배열 생성
#1. 배열 객체 생성
var 참조변수명 = new Array();

변수명[0] = 값;


#2. 배열 객체 생성 + 초기값
var 참조변수명 = new Array(값1, 값2, 값3,....);

  #3. *배열 리털로 생성
var 참조변수명 = []; // 빈 배열
var 참조변수명 = [값, 값2, .....];

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
       //배열 #1
        var arr1 = new Array();
        arr1[0] = 10;
        arr1[1] = "abc";
        arr1[2] = true;
        
        console.log(arr1);
    

        //#2
        var arr2 = new Array(10, 'abcd', false);
        console.log(arr2);
       
        arr2[0]= 200;
        console.log(arr2); 
        
        //#3
       var arr3 = [];
        console.log(arr3);
 
    </script>
</body>
</html>

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
  <script>
    var arr = [100, "abc", true];
      
      arr[3] = -20;
      console.log(arr);
      
      arr[5] = 1000;   //arr[4] 에는 empty가 생김
      console.log(arr); //[100, 'abc', true, -20, empty, 1000]
      
      
      // 배열의 길이
      console.log(arr.length); // 6
        
      //데이터 배열 맨 뒤에 추가 : push()
      arr.push(2000);   
      console.log(arr);     //[100, 'abc', true, -20, empty, 1000, 2000]
      //데이터 배열 맨 앞에 추가 : unshift()
      arr.unshift(2000);
      console.log(arr);    //[2000, 100, 'abc', true, -20, empty, 1000, 2000]
      
      
      // 배열 마지막 데이터값 꺼내서 리턴하고 배열에서는 삭제 : pop()   
      console.log("pop() : " + arr.pop());    //pop() : 2000
      console.log(arr);                   //[2000, 100, 'abc', true, -20, empty, 1000]
      // 배열 앞 데이터값 꺼내서 리턴하고 배열에서는 삭제 : shift()
      console.log("shift() : " + arr.shift());   //shift() : 2000
      console.log(arr);         //[100, 'abc', true, -20, empty, 1000]
      
      // 연결문자 삽입 : join("연결문자")
      var res = arr.join("-")
      console.log(res);  //100-abc-true
      
      // 배열 결합 : concat(배열)
      
      // 베열잘라내기 : slice(startIndex, endIndex)
      res = arr.slice(0,2);
      console.log(res); //[100,'abc']
      
      
      var arr2 = ["bb", "BB", "aa", "AA", 7,2 ,"하늘소","아메라카노", true] 
      // 오름차순 정렬 : sort()
      res = arr2.sort();
      console.log(res);       //[2,7,"AA", "BB","aa","bb",true, "아메리카노", "하늘소]
      
      // 배열 역순 : reverse()
      res = res.reverse();
      console.log(res);       // ['하늘소', '아메라카노', true, 'bb', 'aa', 'BB', 'AA', 7, 2]
      
    </script>
    
</body>
</html>
728x90
728x90

7. 입력문 (잘안씀)
: 입력창을 통하여 사용자로부터 데이터를 입력받는 기능

변수=prompt("질문");
변수=prompt("질문", "default 답변")

입력받은 값은 모두 문자타입으로 받음

8. 제어문 
- 조건문 : if, switch
- 반복문 : while, do while, for
- 보조제어문 : continue, break

 

<!DOCTYPE html>  
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
     //입력문  
     	var age = prompt("당신의 나이는?");
        console.log(age);
        //제어문 if 문
        var num = 0;
        if(num < 100 && num > 0){
            console.log(" 100보다 작다");
        
        }else {
            console.log("100보다 크거나 같다");
        }
       // switch
        var num2 = prompt("정수 입력하세요", 1);
        switch(num2){
            case "1" :
                console.log("1을 입력하셨습니다");
                break;
            case "2" :
                console.log("2를 입력하셨습니다");
                break;
            default:
                console.log("다른 숫자를 입력하셨습니다");
                //break;
        }
        
        
    </script>
</body>
</html>

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
    
    <script>
        var i = 0; 
        while(i < 10){
            document.write("hello<br />");
            i++; 
        }
        
        var a = 0; 
        while(true){
            a++;
            document.write("X10 print");
            if(a == 10){
                break;
            }
        }
        document.write("<br />");
        
        i = 0; 
        do{
            i++; 
            document.write("asdf");
        
        }while(i < 5);
  
    </script>
</body>
</html>

728x90
728x90
package day16;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

//HashMap을 이용하여 학생 이름과 자바 점수를 기록하는 
// 관리 프로그램을 작성하세요. 
// 아래 프로그램 메뉴에서 각 번호로 서비스 선택하고, 
// 6번을 입력받으면 프로그램 종료. 
/*
 	** 자바 성적 관리 프로그램 **
	1. 전체 조회 
	2. 등록
	3. 수정
	4. 삭제
	5. 전체 평균
	6. 프로그램 종료
*/
public class Test04Ex {
	HashMap<String, Integer> data = new HashMap<String, Integer>(); 
	Scanner sc = new Scanner(System.in);
	
	private void printAll() {
		Set<String> keys = data.keySet(); 
		Iterator<String> it = keys.iterator(); 
		while(it.hasNext()) {
			String name = it.next(); 
			int score = data.get(name); 
			System.out.println(name + " : " + score);
		}
		System.out.println("=====================================");
	}
	private void addData() {
		System.out.print("이름>> ");
		String name = sc.nextLine(); 
		System.out.print("점수>> ");
		// String name = sc.nextLine();
		// int score = Integer.parseInt(name);
		int score = Integer.parseInt(sc.nextLine()); 
		// map안에 key값으로 이미 저장된 이름이 있는지 확인 
		Set<String> keys = data.keySet(); 
		if(keys.contains(name)) { // key들중에 입력받은 name과 동일한 값이 있냐? 
			System.out.println("이미 존재하는 학생입니다. 이름을 다시 입력해주세요.");
			//addData(); 
		}else {
			data.put(name, score); // map에 저장 			
			System.out.println("저장 완료");
		}
		System.out.println("=====================================");
	}
	private void modifyData() {
		System.out.print("수정할 학생 이름>> ");
		String name = sc.nextLine(); 
		Set<String> keys = data.keySet(); 
		if(keys.contains(name)) {
			// 점수 입력받아 수정 
			System.out.print("점수 >> ");
			//String name = sc.nextLine();
			//int score = integer.parseInt(name);
			int score = Integer.parseInt(sc.nextLine());
			
			data.put(name, score); // 수정 put(같은키값, 다른벨류값);
			System.out.println("수정완료!");
		}else {
			System.out.println("존재하지 않는 학생입니다..");
		}
		System.out.println("=====================================");
	}
	private void deleteData() {
		System.out.print("삭제할 학생 이름>> ");
		String name = sc.nextLine(); 
		Set<String> keys = data.keySet(); 
		if(keys.contains(name)) {
			data.remove(name);  // 삭제 
			System.out.println("삭제완료!");
		}else {
			System.out.println("존재하지 않는 학생입니다..");
		}
		System.out.println("=====================================");
	}
	private void printAvg() {
		Collection<Integer> col = data.values(); // map에서 값들만 뽑아
		Iterator<Integer> it = col.iterator(); 
		int sum = 0; 
		while(it.hasNext()) {
			sum += it.next(); // 값하나씩 꺼내서 sum에 누적해 더하기 
		}
		double avg = (double)sum / data.size(); 
		System.out.println("평균 점수 : " + avg);
		System.out.println("=====================================");
	}
	public void run() {
		while(true) {
			System.out.println("** 자바 성적 관리 프로그램 **\n"
					+ "1. 전체 조회 \n"
					+ "2. 등록\n"
					+ "3. 수정\n"
					+ "4. 삭제\n"
					+ "5. 전체 평균\n"
					+ "6. 프로그램 종료");
			System.out.print("원하는 서비스 번호를 입력해주세요 >> ");
			int sel = Integer.parseInt(sc.nextLine());
			System.out.println("=====================================");
			if(sel == 1) printAll(); 
			else if(sel == 2) addData(); 
			else if(sel == 3) modifyData(); 
			else if(sel == 4) deleteData(); 
			else if(sel == 5) printAvg(); 
			else if(sel == 6) {
				sc.close();
				System.out.println("프로그램 종료!");
				break;
			}else {
				System.out.println("잘못된 메뉴번호... 다시 입력해주세요.");
			}
		}
	}
	public static void main(String[] args) {
		
		Test04Ex prg = new Test04Ex();
		prg.run();
	}
}​
package day16;

import java.util.Scanner;
import java.util.Vector;

/*
	Scanner 클래스로 -1이 입력될때까지 양의 정수를 입력받아 벡터에 저장하고,
	벡터를 검색하여 가장 큰 수를 출력하는 프로그램을 작성하세요. 
	실행예시:
		정수>> 10 6 22 6 88 77 -1
		가장 큰 수는 88
*/
public class Test01Ex {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		Vector<Integer> v = new Vector<Integer>(); 
		
		System.out.print("정수 >> ");
		while(true) {
			int n = sc.nextInt(); 
			if(n == -1) { // -1인지 먼저 검사 
				break;
			}
			v.add(n); // 벡터에 추가 
		}
		
		// 저장된것이 하나도 없을 경우 예외 처리 
		if(v.size() == 0) {
			System.out.println("저장된 수가 하나도 없습니다.");
			sc.close();
			return;  // main 메서드 강제 종료 
		}
		
		// 가장 큰 수 찾아서 출력 (메서드로 작성해보자)
		printBiggerNum(v); // v를 인자로 던져서 가장큰수 찾아 출력하라고 명령! 
		
	}
	
	
		int max = vector.get(0);
		for(int i = 0; i < vector.size(); i++) {
			if(max < vector.get(i)) {
				max = vector.get(i);
			}
		}
		System.out.println("가장 큰 수는 : " + max);
	
}
package day16;

import java.util.ArrayList;
import java.util.Scanner;

/*
	Scanner 클래스를 사용하여 6개 학점('A', 'B', 'C', 'D', 'F')을 문자로 입력받아
	ArrayList에 저장하고, ArrayList를 검색하여 학점을 점수(A=4.0, B=3.0, C=2.0, D=1.0, F=0)로 변환하여
	평균을 출력하는 프로그램을 작성하세요.
	실행예시:
		6개의 학점을 빈 칸으로 분리 입력(A/B/C/D/F)>>	 A C A B F D
		2.3333333333333335
*/
public class Test02Ex {
	
	public static void main(String[] args) {
		
		ArrayList<String> list = new ArrayList<>();
	 	Scanner sc = new Scanner(System.in);
	 	
	 	
	 		System.out.println("학점을 입력하세요 >> ");
			/*
			 * 		System.out.println("6개의 학점을 빈 칸으로 분리 입력(A/B/C/D/F)>>");
		for (int i = 0; i < 6; i++) {
			Character grade = sc.next().charAt(0);    //입력값 중 첫번째 문자 입력받기 
			list.add(grade);		//어레이에 등급 추가 
		}
		
		double sum = 0;
		for (int i = 0; i < 6; i++) {
			if(list.get(i).equals('A')) {sum += 4.0;}
			else if(list.get(i).equals('B')) {sum += 3.0;}
			else if(list.get(i).equals('C')) {sum += 2.0;}
			else if(list.get(i).equals('D')) {sum += 1.0;}
			else if(list.get(i).equals('F')) {sum += 0;}
			
		}
		System.out.println(sum/list.size());
		sc.close();
			 */
	 	String grade = sc.nextLine();
	 	String[] split = grade.split(" ");
	 		for(String s: split){
	 		list.add(s);
	 		}
		
	 	System.out.println(list);
	 	
	 	System.out.println("학점을 입력하세요 >>");
	 		double sum = 0;
	 		for (int i = 0; i < list.size(); i++) {
	 			
				if(list.get(i).equals("a")) {sum += 4.0;}
				if(list.get(i).equals("b")) {sum += 3.0;}
				if(list.get(i).equals("c")) {sum += 2.0;}
				if(list.get(i).equals("d")) {sum += 1.0;}
				if(list.get(i).equals("f")) {sum += 0.0;}
			}
		System.out.println(" 평균 " +  sum/list.size());
	}
}
package day16;

import java.util.HashMap;
import java.util.Scanner;

public class Test03Ex {
	public static void main(String[] args) {
		// 영한 사전 만들기 
		// : HashMap을 이용하여 10개의 단어를 영어,한글의 쌍으로 저장하고 
		// 영어로 한글을 검색하는 프로그램을 만들어보세요.
		// 단, exit가 입력되면 프로그램 종료!
		
		HashMap<String, String> dict = new HashMap<String, String>();
		
		dict.put("apple", "사과");
		dict.put("paper", "종이");
		dict.put("book", "책");
		dict.put("car", "자동차");
		dict.put("pants", "바지");
		dict.put("bottle", "병");
		dict.put("chair", "의자");
		dict.put("extend", "확장하다");
		dict.put("implement", "실행하다");
		dict.put("banana", "바나나");
		
		Scanner sc = new Scanner(System.in); 
		while(true) {
			System.out.print("찾고싶은 단어 >> ");
			 
			if(eng.equals("exit")) {
				System.out.println("프로그램 종료!");
				break;
			}
			String kor = dict.get(eng);
			if(kor == null) {
				System.out.println(eng + "는 사전에 없는 단어입니다.");
			}else {
				System.out.println(kor);
			}
		}
	
		sc.close();
	}
}
package day16;

import java.lang.ProcessHandle.Info;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;

/*
	id와 tel(전화번호)로 구성되는 Student클래스를 만들고, 이름을 key로 하고 Student객체를 값으로 하는 해쉬맵을 작성해보세요.
	이름을 검색하면 id와 전화번호 출력되고, exit 입력하면 프로그램 종료. 
*/
class Student{
	private int id;
	private String tel;
	public Student(int id, String tel) {
		this.id = id; this.tel =tel;
	}
		public int getId(){return id;}
		public String getTel() {return tel;}
		
		public static void run() {
			
			
			HashMap<String, Student> map = new HashMap<String, Student>();
			map.put("피카츄", new Student(1, "010-1111-2222"));
			map.put("라이츄", new Student(2, "010-1234-5678"));
			map.put("파이리", new Student(3, "010-9999-9999"));
			
			
			Scanner sc = new Scanner(System.in);
			
			
			
			while(true) {
				System.out.println("이름을 입력하세요 ");
				String name = sc.nextLine();
				
				if(name.equals("exit")) {break;}
				
				
				Student info = map.get(name);
				if(info==null) { System.out.println("없는사람입니다 .");}
				
				else {
					System.out.println(name+  ":" + "  id  :  " + info.getId() + "  Tel  :"+info.getTel() );
				
				}
			}	System.out.println("프로그램 종료...");
			sc.close();
		}
		
}

public class Test05Ex {
	public static void main(String[] args) {
	
		Student.run();
	
	}
}
package day16;

import java.util.HashMap;
import java.util.Scanner;

/*
	"그만"이 입력될 때까지 나라이름과 인구를 입력받아 저장하고, 
	다시 나라이름을 입력받아 인구를 출력하는 프로그램을 작성하세요. 
	아래 해쉬맵을 이용하세요.
	HashMap<String, Integer> nations = new HashMap<String, Integer>();
	실행예시 :
		나라 이름과 인구를 입력하세요.(예: Korea 5000)
		나라 이름, 인구 >>  Korea 5000
		나라 이름, 인구 >>  USA 1000000
		나라 이름, 인구 >>  Swiss 2000
		나라 이름, 인구 >>  France 3000
		나라 이름, 인구 >>  그만
		
		인구 검색 >> France
		France의 인구는 3000
		인구 검색 >> 스위스
		스위스 나라는 없습니다.
		인구 검색 >> 그만
		프로그램 종료!
*/
public class Test06Ex {
	public static void main(String[] args) {
		
		HashMap<String, Integer> nations = new HashMap<String, Integer>();
		Scanner sc = new Scanner(System.in);
		
		System.out.println("나라 이름과 인구를 입력하세요.(예: Korea 5000)");
		
		// 나리이름, 인구 입력받아 저장 (그만이 break 포인트) 
		while(true) {
			System.out.print("나라 이름, 인구 >> ");
			String txt = sc.nextLine();
			if(txt.equals("그만")) {
				break; 
			}
			String[] txtSplit = txt.split(" ");
			nations.put(txtSplit[0], Integer.parseInt(txtSplit[1]));
		}
		
		// 나라이름 입력받아 인구 출력 
		while(true) {
			System.out.print("인구 검색 >> ");
			String n = sc.nextLine(); 
			if(n.equals("그만")) {
				break;
			}
			// map의 get(key값) 은 해당 키벨류가 없으면 null 리턴 
			Integer popul = nations.get(n); // 저장하는 변수를 Integer로 받은 이유 : null 체크하려고 
			if(popul == null) {
				System.out.println(n + " 나라는 없습니다.");
			}else {
				System.out.println(n + "의 인구는 " + popul);
			}
		}
		
		System.out.println("프로그램 종료! ");
		sc.close();

	}
}
package day16;

import java.util.Scanner;
import java.util.Vector;

/*
	Vector 컬렉션을 이용하여 강수량의 평균을 유지 관리하는 프로그램을 작성하세요.
	강수량을 입력하면 벡터에 추가하고 현재 입력된 모든 강수량과 평균을 출력한다.
	실행 예시 :
		강수량 입력 (0 입력시 종료)>>	5
		5
		현재 평균 5
		
		강수량 입력 (0 입력시 종료)>>	80
		5 80
		현재 평균 42
		
		강수량 입력 (0 입력시 종료)>>	53
		5 80 53
		현재 평균 46
		
		강수량 입력 (0 입력시 종료)>>	22
		5 80 53 22
		현재 평균 40
		
		강수량 입력 (0 입력시 종료)>>	0
		프로그램 종료!
*/
public class Test07Ex {
	
	public static void main(String[] args) {
	
		Vector<Integer> data = new Vector<Integer>(); 
		Scanner sc = new Scanner(System.in);
		
		while(true) {
			System.out.print("강수량 입력 (0 입력시 종료)>> ");
			int amount = Integer.parseInt(sc.nextLine().trim());
			if(amount == 0) {
				break;
			}
			data.add(amount); 	// 강수량 저장 
			printVector(data);  // 벡터에 저장된 모든 강수량 출력 메서드 호출~ 
			printAvg(data);		// 벡터에 저장된 강수량 평균 출력 메서드 호출~ 
			System.out.println();
		}//while
		
		System.out.println("프로그램 종료!");
		sc.close();
	}//main
	
	public static void printVector(Vector<Integer> vector) {
		for(int i = 0; i < vector.size(); i++) {
			System.out.print(vector.get(i) + " ");
		}
		System.out.println();
	}
	public static void printAvg(Vector<Integer> data) {
		int sum = 0; 
		for(int i = 0; i < data.size(); i++) {
			sum += data.get(i);
		}
		int avg = sum / data.size(); 
		System.out.println("현재 평균 : " + avg);
	}
}

 

package day16;

import java.util.ArrayList;
import java.util.Scanner;

/*
	하나의 학생 정보를 나타내는 StudentClass에는 
	이름, 학과, 학번, 학점 평균을 저장하는 필드가 있다. 
	학생마다 StudentClass 객체를 생성하고 4명의 학생정보를 
	ArrayList<StudentClass> 컬렉션에 저장한 후에,
	ArrayList<StudentClass>의 모든 학생(4명) 정보를 출력하고 
	학생 이름을 입력받아 해당 학생의 학점 평균을 출력하는 프로그램을 작성하세요.
	실행예시:
		학생이름, 학과, 학번, 학점평균 입력하세요.
		>> 호크아이,모바일,1,4.1
		>> 데드풀,안드로이드,2,3.9
		>> 헐크,웹개발,3,3.5
		>> 아이언맨,빅데이터,4,4.25
		---------------------------
		이름:호크아이
		학과:모바일
		학번:1
		학점평균:4.1
		---------------------------
		이름:데드풀
		학과:안드로이드
		학번:2
		학점평균:3.9
		---------------------------
		이름:헐크
		학과:웹개발
		학번:3
		학점평균:3.5
		---------------------------
		이름:아이언맨
		학과:빅데이터
		학번:4
		학점평균:4.25
		---------------------------
		학생 이름 >> 아이언맨 
		아이언맨, 빅데이터, 4, 4.25
		학생 이름 >> 데드풀
		데드풀, 안드로이드, 2, 3.9
		학생 이름 >> 그만 
		프로그램 종료!
*/
class StudentClass {
	private String name; // 이름
	private String dept; // 학과 
	private String id;   // 학번
	private double grade; // 학점평균 
	StudentClass(String name, String dept, String id, double grade){
		this.name = name; this.dept = dept; this.id = id; this.grade = grade;
	}
	public String getName() { return name; }
	public void setName(String name) { this.name = name; }
	public String getDept() { return dept; }
	public void setDept(String dept) { this.dept = dept; }
	public String getId() { return id; }
	public void setId(String id) { this.id = id; }
	public double getGrade() { return grade; }
	public void setGrade(double grade) { this.grade = grade; }
}

public class Test08Ex {
	// 학생 정보 저장할 ArrayList 인스턴스로 만들어 모든 메서드에서 접근할 수 있게..
	ArrayList<StudentClass> list = new ArrayList<StudentClass>(); 
	Scanner sc = new Scanner(System.in);
	
	// 학생정보 저장 
	void setList() {
		System.out.println("학생이름, 학과, 학번, 학점평균 입력하세요.");
		for(int i = 0; i < 4; i++) {
			System.out.print(">> ");
			String data = sc.nextLine(); // 호크아이,모바일,1,4.1
			String[] splited = data.split(","); // 쉼표를 구분자로 분할하여 문자열배열로받기 
			String name = splited[0]; 
			String dept = splited[1]; 
			String id = splited[2]; 
			double grade = Double.parseDouble(splited[3]); // 꺼내서 형변환 
			list.add(new StudentClass(name, dept, id, grade)); 
		}
		System.out.println("---------------------------");
	}
	// 학생정보 출력 
	void printAll() {
		for(int i = 0; i < list.size(); i++) {
			StudentClass stu = list.get(i); 
			System.out.println("이름:" + stu.getName());
			System.out.println("학과:" + stu.getDept());
			System.out.println("학번:" + stu.getId());
			System.out.println("학점평균:" + stu.getGrade());
			System.out.println("---------------------------");
		}
	}
	// 학생 검색 
	void search() {
		while(true) {
			System.out.print("학생 이름 >> ");
			String input = sc.nextLine(); 
			if(input.equals("그만")) {
				break; 
			}
			// list에 저장된 정보에 모두 접근 
			for(int i = 0; i < list.size(); i++) {
				StudentClass stu = list.get(i);
				if(stu.getName().equals(input)) {
					System.out.print(stu.getName() + ", " + stu.getDept() + ", ");
					System.out.println(stu.getId() + ", " + stu.getGrade());
					break; // 먼저 찾으면 for문 끝까지 돌릴필요없이 for문 종료
				}
			}
		}
	}
	
	public void run() {
		setList(); 	// 학생정보 입력받아 저장해라~
		printAll(); // 전체 학생정보 출력해라~ 
		search();	// 학생 검색 하는 기능 실행해라~ 
	}
	
	public static void main(String[] args) {
		Test08Ex ex = new Test08Ex();
		ex.run();
		System.out.println("프로그램 종료!");
	}
}
package day16;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

/*
	Test08Ex문제를 ArrayList<StudentClass>대신 
	HashMap<String, StudentClass> 을 이용하여 다시 작성해보세요. 
	해쉬맵에서 키는 학생 이름으로 한다.
*/
public class Test09Ex {
	// ArrayList<StudentClass> 컬렉션에 저장
	// 학생 정보 저장할 HashMap 인스턴스로 만들어 모든 메서드에서 접근할 수 있게..
	HashMap<String, StudentClass> map = new HashMap<String, StudentClass>(); 
	Scanner sc = new Scanner(System.in);
	
	// 학생정보 저장 
	void setList() {
		System.out.println("학생이름, 학과, 학번, 학점평균 입력하세요.");
		for(int i = 0; i < 4; i++) {
			System.out.print(">> ");
			String data = sc.nextLine(); // 호크아이,모바일,1,4.1
			String[] splited = data.split(","); // 쉼표를 구분자로 분할하여 문자열배열로받기 
			String name = splited[0]; 
			String dept = splited[1]; 
			String id = splited[2]; 
			double grade = Double.parseDouble(splited[3]); // 꺼내서 형변환 
			//list.add(new StudentClass(name, dept, id, grade)); 
			map.put(name, new StudentClass(name, dept, id, grade));
		}
		System.out.println("---------------------------");
	}
	// 학생정보 출력 
	void printAll() {
		
		//Set<String> keys = map.keySet(); 
		//Iterator<String> it = keys.iterator(); // 키들만 뽑음 (이름들) 
		Iterator<String> it = map.keySet().iterator(); 
		while(it.hasNext()) {
			String key = it.next(); // 키값(학생이름) 하나 뽑고 
			StudentClass stu = map.get(key); // 키값주고 벨류값 뽑음 
			System.out.println("이름:" + stu.getName());
			System.out.println("학과:" + stu.getDept());
			System.out.println("학번:" + stu.getId());
			System.out.println("학점평균:" + stu.getGrade());
			System.out.println("---------------------------");
		}
	}
	// 학생 검색 
	void search() {
		while(true) {
			System.out.print("학생 이름 >> ");
			String input = sc.nextLine(); 
			if(input.equals("그만")) {
				break; 
			}
			StudentClass stu = map.get(input);
			if(stu == null) {
				System.out.println(input + " 학생은 없습니다.");
			}else {
				System.out.print(stu.getName() + ", ");
				System.out.print(stu.getDept() + ", ");
				System.out.print(stu.getId() + ", ");
				System.out.println(stu.getGrade());
			}
		}//while
	}// search()
	public void run() {
		setList(); 	// 학생정보 입력받아 저장해라~
		printAll(); // 전체 학생정보 출력해라~ 
		search();	// 학생 검색 하는 기능 실행해라~ 
	}
	public static void main(String[] args) {
		Test09Ex ex = new Test09Ex();
		ex.run();
	}
}
package day16;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;

/*
	이름과 학점(4.5만점)을 5개 입력받아 해쉬맵에 저장하고, 
	장학생 선발 기준을 입력받아 장학생 명단을 출력하세요.
	실해예시:
		자바장학금관리시스템입니다.
		이름과 학점 >> 호크아이 3.1
		이름과 학점 >> 블랙위도우 3.6
		이름과 학점 >> 토르 2.9
		이름과 학점 >> 데드풀 3.7
		이름과 학점 >> 아이언맨 4.3
		장학생 선발 학점 기준 입력 >> 3.2
		장학생 명단 : 블랙위도우 데드풀 아이언맨
*/
class Scholarship {
	private String title; 
	private HashMap<String, Double> map = new HashMap<String, Double>(); 
	private Scanner sc = new Scanner(System.in);
	
	Scholarship(String title) {
		this.title = title;
	}
	void insert() {
		System.out.println(title + "관리시스템입니다.");
		for(int i = 0; i < 5; i++) {
			System.out.print("이름과 학점 >> ");
			String[] txt = sc.nextLine().split(" "); 
			map.put(txt[0], Double.parseDouble(txt[1]));
		}
	}
	void select() {
		System.out.print("장학생 선발 학점 기준 입력 >> ");
		double cutline = Double.parseDouble(sc.nextLine());
		
		System.out.print("장학생 명단 : ");
		Iterator<String> it = map.keySet().iterator(); // 키들만 뽑아서 반복자 얻어오기(키들 일렬로 나열)
		while(it.hasNext()) {
			String name = it.next(); // 키하나 나옴
			double score = map.get(name); 
			if(score >= cutline) {
				System.out.print(name + " ");
			}
		}
		System.out.println();
	}
}

public class Test10Ex {
	public static void main(String[] args) {
		Scholarship sship = new Scholarship("자바장학금");
		sship.insert();
		sship.select();
	}
}
package day16;

import java.util.ArrayList;
import java.util.Scanner;

/*
	나라와 수도 맞추기 게임을 만들어 보세요. 
	1) 나라이름(country)과 수도(capital)로 구성된 Nation클래스를 작성하고,
		ArrayList<Nation> 컬렉션을 이용하여 
		아래 실행 예시와 같이 작동되도록 프로그램을 작성하세요.
		
	실행예시:
		** 수도 맞추기 게임을 시작합니다 **
		입력:1, 퀴즈:2, 종료:3 >> 1 (사용자가 입력)
		
		현재 8개의 나라와 수도가 입력되어 있습니다. (input())
		나라와 수도 입력9>> 한국 서울
		나라와 수도 입력10>> 그리스 아테네
		그리스는 이미 있습니다!!
		나라와 수도 입력10>> 호주 시드니
		나라와 수도 입력11>> 이탈리아 로마
		나라와 수도 입력12>> 그만
		
		입력:1, 퀴즈:2, 종료:3 >> 2
		
		호수의 수도는? 시드니 (quiz())
		정답!!
		독일의 수도는? 하얼빈
		아닙니다!!
		멕시코의 수도는? 하얼빈
		아닙니다!!
		이탈리아의 수도는? 로마
		정답!!
		한국의 수도는? 서울
		정답!!
		영국의 수도는? 그만
		
		입력:1, 퀴즈:2, 종료:3 >> 3
		게임을 종료합니다.
*/
class Nation {
	private String country;
	private String capital;
	Nation(String country, String capital){
		this.country = country; this.capital = capital;
	}
	public String getCountry() {
		return country;
	}
	public String getCapital() {
		return capital;
	}
}
class CapitalGame {
	Scanner sc; 			//       0						1 .....
	ArrayList<Nation> list; // [N(멕시코, 멕시코시티), N(스페인, 마드리드)...]
	
	CapitalGame() {
		sc = new Scanner(System.in);
		list = new ArrayList<Nation>();
		// 나라 정보 초기값으로 미리 추가 
		list.add(new Nation("멕시코", "멕시코시티"));
		list.add(new Nation("스페인", "마드리드"));
		list.add(new Nation("프랑스", "파리"));
		list.add(new Nation("영국", "런던"));
		list.add(new Nation("이탈리아", "로마"));
		list.add(new Nation("그리스", "아테네"));
		list.add(new Nation("중국", "베이징"));
		list.add(new Nation("우크라이나", "키이우"));
	}// 생성자
	
	void input() {
		int n = list.size(); // 8
		System.out.println("현재 "+ n +"개의 나라와 수도가 입력되어 있습니다.");

		while(true) {
			n++; 
			System.out.print("나라와 수도 입력" + n + ">> ");
			String txt = sc.nextLine(); 
			if(txt.equals("그만")) {
				break; // while true 종료 
			}
			String[] split = txt.split(" ");
			String country = split[0]; // 나라이름 
			String capital = split[1]; // 수도 
			// 나라가 존재하는지 체크 -> 메서드 
			if(isExists(country)) { // true 리턴받았을 경우 
				// 있으면 예외 메세지 
				System.out.println(country + "는 이미 있습니다!");
				n--; 
			}else { // false 리턴받았을 경우 
				// 없으면 list에 Nation으로 객체 만들어 추가 
				list.add(new Nation(country, capital));
			}
		}// while
	}// input()
	private boolean isExists(String country) {
		boolean result = false; // 마지막에 리턴해줄 결과 변수 미리 선언 
		
		// 리스트 저장된 개수만큼 전체 돌면서 나라이름 같은지 결과 리턴  
		for(int i = 0; i < list.size(); i++) {
			Nation nation = list.get(i);
			String ctr = nation.getCountry(); // 이미 저장된 나라이름 하나 꺼냄 
			if(ctr.equals(country)) {
				result = true; 
				break; // 한번 걸리면 나머지는 안돌아도 ok 
			}
		}
		return result; // 최종 boolean변수에 남은 결과 리턴 
	}
	void quiz() {
		// 반복해서 문제내고 (그만을 입력할때까지) 
		while(true) {
			//	 문제는 랜덤으로 뽑아서 내보자 (중복 문제는 무시) 
			// 	 문제를 내려면 list에서 나라하나 뽑아야되고 -> list.get(인덱스);
			//		=> 인덱스 번호를 랜덤으로 하나 받아서 
			//			범위 : 0 ~ 마지막 방번호 (list.size()-1)
			int index = (int)(Math.random() * list.size()); // 0 ~ 9 = 10 0 ~ 5 = 6 
			Nation nation = list.get(index); // country=나라이름, capital=수도
			//	  ->나라 뽑은거에서 나라이름 검색해서 문제로 내고 
			String question = nation.getCountry(); 
			String answer = nation.getCapital(); 
			System.out.print(question + "의 수도는?"); // 문제 지문
			String capAsw = sc.nextLine(); // 정답받기 
			// 그만을 입력했는지 먼저 체크
			if(capAsw.equals("그만")) {
				break; // while문 종료! 
			}
			//	  ->나라 뽑은거와 수도이름이 같은지 체크 
			if(capAsw.equals(answer)) {
				// 맞으면 정답!! 
				System.out.println("정답!!");
			}else {
				// 틀리면 틀렸다고 출력 
				System.out.println("아닙니다!!!!!");
			}
		}
	}// quiz() 
	
	// main 대신 전체 프로그램을 돌려주는 메서드 
	void run() {
		System.out.println("** 수도 맞추기 게임을 시작합니다 **");
		while(true) {
			System.out.print("입력:1, 퀴즈:2, 종료:3 >> ");
			int menu = Integer.parseInt(sc.nextLine());
			if(menu == 1) { // 입력
				input(); 
			}else if(menu == 2) { // 퀴즈 
				quiz(); 
			}else if(menu == 3) {
				System.out.println("게임을 종료합니다.");
				sc.close();
				break;
			}else {
				System.out.println("메뉴 번호 오류... 다시 입력해보세요.");
			}			
		}//while
	}//run()
}

public class Test11Ex {
	public static void main(String[] args) {
		
		CapitalGame game = new CapitalGame();
		game.run();
		
	}
}
package day16;
/*
	나라와 수도 맞추기 게임을 만들어 보세요. 
	* Test11Ex문제를 HashMap<String, String>을 이용하여 작성하세요. 
	Key는 나라이름이고, Value는 수도입니다.
*/
public class Test12Ex {
	public static void main(String[] args) {
		/*
		CapitalGame game = new CapitalGame();
		game.run();
		*/
		int a = 10;
		boolean b = false;
		if ((b == false) || (++a == 10)) {
			System.out.println("Equal " + a);
		} else {
			System.out.println("Not equal! " + a);
		}
		

	}
}
728x90
728x90
/* CSS 파일 */
* {
    box-sizing: border-box;   /* width = 컨텐츠 + padding + border두께 */
}
body {
    /* 상하 여백 0, 좌우 auto는 중앙배치 (width지정해야 적용됨) */
    margin: 0 auto;   
    color: #3d3d3c;   /* 전체 글씨 색 */
    font-family: 'Spoqa Han Sans Neo', 'sans-serif';
}
/* 중앙배치를 위한 css */
.inner {
    width: 100%; 
    height: 100%; 
    margin: 0 auto; 
    padding: 0 2rem;
}

header {
/*    background-color: orange;*/
    width: 100%; 
    height: 60px;
    top: 0; 
    left: 0; 
    position: fixed; /* 위치 고정 */
    z-index: 1000;
}
.header-container {
    width: 100%; 
    height: 100%; 
    display: flex;
    justify-content: space-between;
    align-items: center;
}
.header-logo {
    font-weight: bold; 
    font-size: 1.2rem
}
.header-text {
    font-weight: bold; 
    font-size: 0.9rem;
}

/*section 태그 모두에게 달기 */
section {
/*    background-color: aqua; */
    width: 100%; 
    position: relative;
}
/* section에 클래스 속성 main이라고 달아둔것 */
.main {
    height: 360px; 
    background-image: url(images.jpg); 
    
}
.title-container {
    padding-top: 100px;
    padding-bottom: 100px;
}
.title {
    font-size: 2rem; 
    font-weight: bold;
    margin-bottom: 1rem;
}
.message {
    font-size: 1.4rem;
    font-weight: normal; 
}

footer {
    background-color: magenta;
}


@media screen and (min-width: 1200px) {
    .inner {
        max-width: 1200px; 
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <!-- 폰트 라이브러리 경로 -->
    <link href='//spoqa.github.io/spoqa-han-sans/css/SpoqaHanSansNeo.css' rel='stylesheet' type='text/css'>
    <!-- 외부 스타일 시트에 작성하고 여기 적용시키기  --> 
    <link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <header>
        <div class="inner">
            <div class="header-container">
                <div class="header-logo">Test </div>
                <div class="header-text">실습용 사이트 예시 </div>
            </div>
        </div>
    </header>
    <section class="main">
        <div class="inner">
            <div class="title-container">
                <div class="title">테스트</div>
                <div class="message">
                    안녕하세요 <br />
                    테스트용 사이트 입니다. <br />
                    css는 어려워요 
                </div>
                
            </div>
        </div>
    </section>
    <footer>
        © Chance
        -----@gmail.com
    </footer>
    
    
</body>
</html>
728x90

'WEB Creator > [CSS]' 카테고리의 다른 글

[CSS] 9 - Flexbox  (0) 2022.06.07
[CSS] 8 - media query 미디어쿼리  (0) 2022.06.07
[CSS] 7 - 포지셔닝  (0) 2022.06.07
[CSS] 3 - 적용 스타일과 박스 모델  (0) 2022.05.31
[CSS] 2 - 선택자  (0) 2022.05.31
728x90

[Javascript]

1. 자바스크립트
HTML : 브라우저에 표시할 내용 나열
CSS : HTML 요소에 디자인 접목
Javascript : 정적인 웹 문서에 동작을 부여(동적)

 @ 1) 객체 기반의 스크립트 프로그래밍 언어
웹브라우저 내에서 많이 사용, 다른 응용프로그램의 내장 객체에도 접근 가능한 기능있음.
웹 브라우저에는 javascript 엔진 (번역해서 실행시켜주는 역할)이 탑재되어 있다.
브라우저가 아닌 환경에서 실행시키고 싶으면 엔진을 설치해야함
(node검색 > 엔진 다운받아 설치 가능)


2. 기본사항

1) 작성 방법
- HTML 문서안에 <script> 태그안에 작성
- 확장자가 .js 파일에 js코드 작성하고 html문서에 연결.
<script src="js파일경로"></script>

2) 주석 
// 한줄 주석
/* 여러줄 주석 */


3. 변수
int num 10;   double num 10.123;
   var num = 10; var num = 10.123;

* ES6 버전부터 바뀐 : let, const


4. 데이터 타입
: 값의 종류들

1) 숫자형 Number
정수:  10진수  그냥쓰면됨
16진수 0x로 시작, 0~9 A~F (주로 색상값 나타낼때 사용)
실수: 소수점 있는수

2) 문자형 String
문자열 홑/겹 따옴표로 묶은 형태

3) 논리형 Boolean
true / false 두가지 경우의 값을 갖는 형태

4) undefined
: 변수를 선언만하고, 초기화하지 않는것 출력
함수 인자값 없이 호출되는 경우
존재하지 않는 속성을 접근한 경우

5. 연산자
1) 산술 : + _ * / %
2) 대입 : =
3) 복합대입 : += -= *= /= %=
4) 증감 : ++ -- (전위형, 후위형)
5) 비교 : < <= => >
== : 데이터의 타입 관계없이 같으면 true 10=="10" true
=== : 데이터의 타입도 같아야 true 10 === "10" false
!= : 데이터 타입 관계없이 같으면 false
!== : 데이터 타입도 일치해야 false
6) 논리 : || or  / && and  / !
7) 삼항 : var b = (5 < 4) ? 50 (참일때): 40; (거짓일때) 

<!-- js01.html --> 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
    
    
    
    <script>
        // 자바스크립트 작성 영역 
        // #1. console.log() (-> 브라우저 개발자도구의 console탭에 출력)
        //console.log("hello!!!");
        // #2. alert() (-> 브라우저에 경고창으로 띄우기)
        //alert("안녕하세요");
        // #3. document.write()  (-> 브라우저 화면에 출력하기)
        document.write("<h1>hello js</h1>"); 
        
        var name = "홍길동"; 
        var age = 30; 
        var play = false;
        console.log(name);
        console.log(typeof name); // 해당 변수의 타입 리턴 
        console.log(typeof age);
        console.log(typeof play);
     
        var test;
        console.log(test);

        
    </script>
</body>
</html>

6. 형변환
: 데이터 타입을 변환 시키는 작업
# 자동형변환
1) 숫자 + 문자 => 문자
2) 불린 + 문자 => 문자
3) 불린 + 숫자 => 숫자 (true = 1, false = 0)

(*제일많이씀*) 숫자 -> 문자 : 10+"" -> "10"

# 강제형변환
1) 문자 -> 숫자
정수 : parseInt()
Number()
실수 : parseFloat()
Number()
2) 숫자 -> 문자
일반문자 : String()
16진수 : .toString(진수)
실수문자: .toFixed(소수점자리수)

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
   
   <script>
    //자동형변환
       var a = "30";
       var res = 1 + a + 10;  //13010로 나옴
       var res2 = a + 1 + 10; //30110
       console.log(res2); 
       
       res = 2 + true;
       console.log(res);
       //
    
       
       //강제 형변환
       //문자 -> 숫자
       var num = "123.456";   
       res3 = parseInt(num);   //정수로 변환  소수점 x
       console.log(res3);
       res4 = Number(num);      // 숫자로 변환 소수점 o/x
       console.log(res4);
       res5 = parseFloat(num); //실수로 변환
       console.log(res5);
       
       
       //숫자 -> 문자
       var num = 123.343
       res6 = String(num);
       console.log(res6);
       console.log(typeof res6);
    </script>
    
</body>
</html>

728x90
728x90

9. CSS Flexbox
https://flexboxfroggy.com/
https://codepen.io/enxaneta/full/adLPwv

flexbox는 상위요소인 flex container와 하위 자식요소인 flex item들로 구성됨
즉, item이 수평정렬할 요소들이면, 
해당 요소를 감싸고 있는 부모요소로 flex container가 필수적임.

1) flexbox container 속성
display : flex container 정의
flex-direction : item들의 주축 (방향)을 설정
flex-wrap : item들을 1행 또는 복수행으로 배치하는 설정
flex-flow : flex-direction과 flex-wrap을 한번에 설정하는 단축속성
flex-flow : direction과 wrap값

justify-content : 가로기준 배치 방법
align-content : 수직정렬 방법 (각 행 마다 적용)
align-items : 수직정렬 방법 (복수행이면 하나의 그룹처럼 적용)

2) flexbox item 속성
order : 배치순서 설정 
flow-grow : item 너비 증가 비율 설정
flex-shrink : item 너비 축소 비율
flex-basis : item 기본 너비 설정
flex : 위의 3개를 한번에 설정
align-self : 요소하나하나 정렬

 

<!DOCTYPE html> flexxx박스
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .container{
            border: 1px solid red;
            /* display: flex;  가로로 펴침 */ 
            /* flex-direction: column; */
        }
        .item{
            border: 1px solid blue;
            width: 100px;
            height: 100px;
        }
          /*  .item1{
            order: 3 순서바꾸기 */
        }
    
    </style>
</head>
<body>    
   <div class="container">
            <div class="item1 item"> </div> 
            <div class="item2 item"> </div>
            <div class="item3 item"> </div>   
   
   </div>
    
</body>
</html>
728x90

'WEB Creator > [CSS]' 카테고리의 다른 글

[CSS + HTML] 간단 사이트  (0) 2022.06.07
[CSS] 8 - media query 미디어쿼리  (0) 2022.06.07
[CSS] 7 - 포지셔닝  (0) 2022.06.07
[CSS] 3 - 적용 스타일과 박스 모델  (0) 2022.05.31
[CSS] 2 - 선택자  (0) 2022.05.31
728x90

8. media query 미디어 쿼리 : 반응형 레이아웃
(모바일, pc등에 따라 사이즈를 다르게 보여줌)

반응형 웹 : 동일한 페이지를 보여주되, 화면 사이즈에 따라 다르게 보여줌.
화면 사이즈에 따라 배치 달라짐 (주소는 동일)

적응형 웹 : 모바일인지 pc인지에 따라 다른 페이지를 보여줌.
m.naver.com  / www.naver.com (주소가 다름)

pixel/ viewport
pixel : 화소
viewport : 화면상 표시 영역.
meta viewport : 원하는 너비를 넣으면 해당 너비에 맞게 브라우저가 표시함.
<meta name="viewport" content="width=320">

-> 다양한 디스플레이에 맞는 웹페이지 구현
1) html <meta name="viewport" content="width=device-width">
2) css : 미디어쿼리 : 반응형 레이아웃 구현하기 위한 기술
* 기본 문법
@media media-type and (media-feature-rule){
//CSS코드
}

* media-type (미디어 유형)
all
print 프린트화면
screen 브라우저화면
speeach 음성

* media-feature-rule (미디어 조건)
width viewport의 너비, *min-width, *max width 많이 사용
height viewport의 높이
device-width 디바이스의 물리적 너비
device-height 디바이스의 물리적 높이
*orientation 디바이스의 방향 (가로 = landscape, 세로 = portrait)
apspect-ratio viewport의 가로세로 비율

@media (max-width : 1024px){ccs코드}  
->화면 너비가 1024px 이하인 경우까지 해당css적용

@media screen and (max-width:1200px{css코드}
-> 화면너비가 1200px 이하이고, 브라우저 화면이면 해당 css적용

@media screen and (min-width:1200px) and (orientation: landscape){css코드}
-> 화면너비가 1200px 이상이고, 브라우저 화면이면서 가로방향일때만 css적용

 

<!DOCTYPE html> 미디어쿼리설명
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <!-- media query적용하기 위해 --> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
    <style>
        header {
            background-color: aqua; 
        }
        nav {
            background-color: orange; 
        }
        section {
            background-color: red;
        }
        article {
            background-color: blue; 
        }
        aside {
            float: right;
            background-color: brown; 
        }
        footer {
            background-color: gray; 
        }
        @media screen and (max-width:750px){  <!-- 폭이 750 이상이어야 aside가 생김 -->
            aside{
                display: none;   
            }
        }
    </style>
    
</head>
<body>
   <header>header</header>
   <nav>nav</nav>
   <aside> aside  <br /><br /> </aside>
   <section>
       section
       <article> artice </article>
   </section>
   <footer> footer </footer>
   
</body>
</html>

728x90

'WEB Creator > [CSS]' 카테고리의 다른 글

[CSS + HTML] 간단 사이트  (0) 2022.06.07
[CSS] 9 - Flexbox  (0) 2022.06.07
[CSS] 7 - 포지셔닝  (0) 2022.06.07
[CSS] 3 - 적용 스타일과 박스 모델  (0) 2022.05.31
[CSS] 2 - 선택자  (0) 2022.05.31
728x90

7. 포지셔닝
1) box-sizing :박스 너비 정하기
width, height, margin, padding, border 지정

박스모델의 너비 = 컨텐츠 크기 + 좌우 padding 
+ 좌우 border 두께 + 좌우 margin => 전체요소 너비

box-sizing 속성값
content-box : width로 지정하는 범위가 컨텐츠 영역의 너비로 사용(dafault)
border-box : width로 지정하는 너비가 테두리까지 포함한 너비로 사용

 

<!DOCTYPE html>
// 박스 포지션 설명
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>selector</title>
    <style>
        .box1{
            box-sizing: content-box;
            background-color: yellow;
            width: 300px;
            height: 150px;
            margin: 10px;
            padding: 30px;
            border: 2px solid red;
        }
        .box2{
            box-sizing: border-box;
            background-color: lightblue;
            width: 300px;
            height: 150px;
            margin: 10px;
            padding: 30px;
            border: 2px solid red; 
        }        
    </style>
</head>
<body>
    <div class="box1"> content-box </div>
    <div class="box2"> border-box </div>
</body>
</html>




2) float 속성
:요소를 문서위에 떠있게 만들어 왼쪽/ 오른쪽으로 배치

left : 왼쪽배치
right : 오른쪽배치
non: 좌우 어느쪽도 배치 x

float 속성해제 : clear 속성
:float 속성을 요소에 사용하면 다음에 오는 다른 요소들도 
속성이 전달되어, 배치가 원하는 방식으로 이루어지지 않을 수 있다.
float 속성이 더이상 유용하지 않다고 알려주는 속성이 필요한데 
그것이 clear이다.

left : float: left적용한것 해제
right : float:rigt 적용한것 해제
both :  좌우상관없이 기본상태로 되돌릴때 사용 

<!DOCTYPE html>
//float 설명
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box1{
            background-color: yellow;
            width: 200px;
            height: 150px;
            margin: 10px;
            padding: 30px;
            float: left;
        }
        
        .box2{
            background-color: lightblue;
            width: 200px;
            height: 150px;
            margin: 10px;
            padding: 30px;
            float: left;
        }
         .box3{
            background-color: orange;
            width: 200px;
            height: 150px;
            margin: 10px;
            padding: 30px;
             clear: both        
        }
         .box4{
            background-color: turquoise;
            width: 200px;
            height: 150px;
            margin: 10px;
            padding: 30px;
            clear: both
        }
    
    </style>
</head>
<body>
   <div class="box1"> box1 </div>
   <div class="box2"> box2 </div>
   <div class="box3"> box3 </div>
   <div class="box4"> box4 </div>
</body>
</html>

 


3) position 속성
-static (default)
다른 태그와의 관계에 의해 자동으로 배치
- relative 
원래 배치되어야하는 위치를 기준으로, 좌표로 지정
- absolute
가장 가까운 위치에 있는 position 속성이 relative인 부모 요소를 기준으로,
left, right, top, bottom 값으로 요소 위치 지정
position 속성이 relative인 부모가 없으면 body를 기준으로 위치
- fixed (고정 위치)
화면에 보여지는 영역을 기준으로 특정 위치에 배치 
(스크롤 해도 고정- 따라다님)


728x90

'WEB Creator > [CSS]' 카테고리의 다른 글

[CSS] 9 - Flexbox  (0) 2022.06.07
[CSS] 8 - media query 미디어쿼리  (0) 2022.06.07
[CSS] 3 - 적용 스타일과 박스 모델  (0) 2022.05.31
[CSS] 2 - 선택자  (0) 2022.05.31
[CSS] 1 - 개념과 적용 방법  (0) 2022.05.31
728x90

[day18]

 

 

  1. Network

1) 네트워크  :  데이터를 전송할 수 있는 통신망, 전자장비들의 집합, 장비와 장비를 연결한 것.

 

노드 Node : 네트워크에 연결된 모든 장치들

호스트 Host : 노드에게 하나 이상의 서비스를 제공해주는 노드

-> 데이터 주고 받기 위해 존재 (통신)

-> 통신을 하려면 약속이 필요함 : protocol : 데이터 전송 규약

 

유형 : 네트워크 크기와 용도에 따라 LAN, WAN으로 구성

 

LAN Local Area Network : 지역망 ( 작은 망)

통신 주체인 자신과 “동일한” 네트워크간의 통신을 의미하며

작은 범위로 구성된다 -> 스위치

통신장비 : NIC(랜카드), T/P cable, Switch 

통신 프로토콜 : Ethernet < FastEthernet < GigabitEthernet

통신주소 : Mac-address : 물리주소 

 

 

 

WAN Wide Area Network : 큰망

내부 -> 외부로 통신할때 

일반적으로. ISP(kt, sk…..)로 부터 임대회선을 사용하기 때문에 구축비용은 감소하지만 통신 및 유지/보수 비용이 증가

 

자신이 포함되지 않은 “외부” 네트워크 구간을 의미하며, 비교적 큰 범위로 구성된다.

 

대표장비 : Router 라우터

통신프로토콜 : IPv4 (Internet Protocol version4)

통신주소 : IP address : 논리주소

 

 

 

 

 

 

 

2) IP address : Internet Protocol Address

: 통신을 하는 모든 기계는 네트워크상에서 유일하게 자신을 식별 할 수 있는

“고유주소”를 가지고 있다.

IP 주소는 32비트의 이진수로 구성, 보통 8비트 씩 4부분으로 나누어 십진수로 표현

ex)192.168.100.74

 

숫자로 된 주소는 기억하기 어려우므로 www.naver.com 과 같은 문자열로 구성된

도메인 이름으로 바꿔서 사용한다.

사용자가 도메인 이름으로 페이지를 요청하면,

DNS(Domain Name System) 서버에 의해 숫자로 구성된 IP 주소로 자동 변환.

 

IPv4 : 4개의 숫자로 구성된 32비트의 IP 주소

IPv6 : 128비트로 구성 

 

IP조수 확인 : Cmd - > ipconfig (요약)

ipconfig -all (자세히)

 

3) Port : 데이터를 주고받는 통로, 여러개의 서비스를 해줄 때

서로 충돌이 나지 않도록 포트를 구분해서 만들어 놓음.

포트번호는 개발자가 임의로 선택해 사용할 수 있으나,

기존 응용 프로그램에서 사용하는 번호나 시스템 포트 번호는 피하는 것이 좋다.

잘 알려진 포트번호 : HTTP = 80, FTP = 21, Telnet = 23

기존 잘 알려진 포트는 0 ~ 1023 사이번호를 가지며,

사용자 지정하는 번호는 이 범위를 피해서 선택하도록

 

 

윈도우 cmd > netstat -a

    맥.  sudo lsof -PiTCP -sTCP:LISTEN. https://velog.io/@taelee/%ED%98%84%EC%9E%AC-%EC%97%B4%EB%A0%A4%EC%9E%88%EB%8A%94-%ED%8F%AC%ED%8A%B8-%ED%99%95%EC%9D%B8mac)

 

 

4) Protocol : 통신 규약

컴퓨터간에 정보를 주고받을 때의 통신 방법에 대한 규칙과 약속

대표적인 표준 프로토콜의 예는 인터넷에서 사용하는 TCP/IP가 이에 해당한다.

 

5) 데이터 전송 방식

: IP 프로토콜 위에서 동작 

# 1.  TCP Transmission Control Protocol

연결형 서비스를 제공함. 신뢰성 높음.

ex) download

데이터 전송시 세그먼트 블록단위로 분할해 전송하고,

하나 전송하고 받는쪽에서 잘 받았다는 ACK 신호를 보내면

다음 블록을 전송.

 

# 2. UDP User Datagram Protocol

비연결형 서비스를 제공. 빠른 전송. 신뢰성 떨어짐

ex) streaming service

전송한 데이터가 목적지 까지 제대로 도착했는지 확인하지 않는다.

 

6) OSI 7 계층 : 모든 네트워크 통신에서 생기는 여러가지 충돌 문제를 완화하기 위하여

국제 표준기구(IOS)에서 표준화된 네트워크 구조를 제시한 기본 모델

https://shlee0882.tistory.com/110

 

  1. Java.net (더 좋은게 있어서 잘 안쓴다)

InetAddress 클래스

: 자바에서 IP다루기 위한 클래스

URL 클래스

: 자바에서 URL을 다루기 위한 클래스

프로토콜 :  //호스트명:포트번호/경로명/파일명?쿼리스트링# 참조  

 

https://isplus.joins.com/2022/05/27/enter/entertainment/20220527085428908.html : URL

 

포롴토콜 : HTTPS, HTTP     https=443. http =80

ip(호스트명) : 도메인 주소 

포트번호 : 443 생략

경로명 : 접근하려는 자원이 저장된 서바상의 위치 : contect path, 루트 컨텍스트

파일명 : 접근하려는 페이지 이름

쿼리스트링 : ? 뒷부분 ( 데이터 문자형태로 전송 파라미터명 =값&파라미터명 = 값..)

 

URL !=URI

 

 

  1. 소켓 프로그래밍

: 소켓을 이용한 통신 프로그래밍

소켓 = 통신하는 두 응용 프로그램간의 통신 링크 각 끝단 (endpoint)

TCP/IP 프로토콜을 따르며, TCP/UDP 방식이 있다. 

 

1) TCP 소켓 : 클라이언트( 사용자, 요청자)와 서버(서비스 제공자, 호스트) 간의 1 : 1 통신

통신은 서버가 먼저 클라이언트의 접속을 기다리고, 클라이언트가 서버에 접속을 하면,

그때부터 서로 데이터를 주고 받을 수 있다.

 

 

# 구조

클라이언트 서버

—————————————————————————

[Server Socket]

listener = new ServerSocket(서버 port번호); (1)

| 대기중

clientSocket = new Socket(서버ip port);

Socket socket = listener.accept();  -> 접속시도

 

clienSocket.getOutputStream(); socket.getInputStream();

-> 채팅 문자 보내기

<- 모든 클라이언트에게 채팅문자 보내기

clienSocket.close(); socket.close();

 

 

 

 

 

(1) 서버 프로그램에서 포트와 연결된 서버소켓을 사용하여 클라이언트 연결 요청을 처리할 준비함.

(2) 클라이언트 프로그램은 접속할 서버의 IP주소와 포트번호를 가지고 서버소켓을 생성해서 서버에 연결 요청

서버 소켓은 클라이언트 연결을 요청받아, 서버에 새로운 소켓을 만들어 클라이언트 소켓과 연결되도록 한다.

(3) 클라이언트 끼리 서버를 통해 데이터를 주고 받는다.

(4) 연결해제

728x90
728x90

[day17]

 

  1. 입출력 : java.io 패키지

IO = I/O = input/output 

 

  1. File 클래스 : java.io.File

  : 크기, 생성, 삭제, 변경 등등 내용 관리 가능

입출력 X 

 

1) 생성자

File(String pathname) :  파일확장자명을 포함한 전체 경로를 문자열로 주며 생성

File(File parent, String child) : parent(부모) 디렉토리안에 child 이름의 서브디렉토리나 파일을 나타내는 객체생성

File(String parent, String child) : parent(부모) 디렉토리안에 child 이름의 서브디렉토리나 파일을 나타내는 객체생성

 

File(URI uri) : file:URI를 추상경로명으로 변환하여 객체생성 

 

 

2) 객체 생성

File 참조 변수명 = new File(“전체 경로”);

c: [temp]-test.txt

File(String pathname) -> File f = new File(“c:\\temp\\test.txt);

File(String parent, String child) -> File f = new File(“c:\\temp”, “test.txt”);

* 파일은 확장자명까지 표기

 

3) 주요 메서드++

boolean mkdir() :  새로운 디렉토리(폴더) 생성

boolean createNewFile() : 빈 파일 생성. 생성하려는 파일이 이미 존재하면 생성X

String[] list() : 디레고리내의 파일과 서브 디렉토리 목록을 문자열 배열로 리턴

File[] listFiles() : 디레고리내의 파일과 서브 디렉토리 목록을 File 객체로 리턴

boolean delete() : 파일 또는 디렉토리 삭제

boolean renameTo(File dest) : dest 경로명으로 파일 이름(경로) 변경

long length() : 파일 크기 리턴

String getPath() : 경로 문자열로 리턴

String getAbsolutePath() : 절대경로를 문자열로 리턴

String getParent() : 파일이나 디렉토리의 부모디렉토리 이름 리턴

String getName() : 파일이나 디렉토리의 이름 문자열 리턴

boolean isFile() : 파일이면 true 

boolean isDirectory() : 디렉토리면 true 

long lastModified() : 마지막 변경시간 리턴

boolean exists() : 파일 또는 디렉토리가 존재하면 true

 

 

 

 

  1. Stream 스트림 ( 와이파이라 생각하면 쉬움)

: 데이터가 돌아다니는 통로 (선) -> 데이터를 목적지로 I/o 하기 위한 방법.

 

- 스트림은 다른 목적지로 데이터를 보낼때 가장 중요한 역학을 한다. 

- 스트림은 단 방향 : input 따로 output 따로

- 자바 응용 프로그램은요 입력 스트림과 출력스트림과만 연결을하고, 

입출력장치 제어하고 실질적인 입출력처리는 스트림이 진행한다.

 

입력장치 or 파일 ——> 입력 스트림 ——-> 자바 응용 프로그램

출력장치 or 파일 <——출력스트림 ——— 자바 응용프로그램

 

- 스트림을 통해 흘러가는 기본 단위는 바이트나 문자이다.

자바 스트림 객체는 바이트 단위로 입출력하는 바이트 스트림과

문자 단위로 입출력하는 문자 스트림으로 나뉜다.  

바이트 스트림을 다루는 클래스는 공통적으로 뒤에 Stream 붙고

문자 스트림을 다루는 클래스는 공통적으로 뒤에 Reader/Writer가 붙어 구분 가능.(문자하나 2바이트 취급)

 

- close() : 스트림을 열었으면 사용 후 반드시 닫아줘야 메모리 누수가 안된다, 

 

 

 

  1. 바이트 스트림

- 바이트 단위로 데이터 전송 (바이너리 데이터가 흐르는 스트림)

- 다양한 클래스 제공으로 용도에 맞게 골라 사용

- 이미지, 동영상 등 전송 가능

 

***1) InputSteam, OutputSream ***

: 추상 클래스. 바이트 단위 입출력 처리를 위한 공통기능을 가진 수퍼 클래스

 

 

2) FileOutputStream

: 파일에 출력을 하기 위한 클래스

파일에 바이너리 데이터를 저장할 수 있다.

바이너리 파일은 사람이 읽고 해석하는것이 거의 불가능. 

 

 

#1. 생성자

FileOutputStream(File file) : file이 지정하는 파일에 출력 스트림 생성

FileOutputStream(String name) : name이 지정하는 파일에 출력 스트림 생성

FileOutputStream(File file, boolean append) : append가 true면 파일 마지막부터 데이터 저장

FileOutputStream(String name, boolean append) : append가 true면 파일 마지막부터 데이터 

 

#2. 주요 메서드

void write(int b) : int 형으로 넘겨진 바이트 한개 출력

void write(byte[] b) : 배열 b의 바이트를 모두 출력

void write(byte[] b, int offset, int Len) : Len 크기만큼 offset 부터 배열 b를 출력

void flush() : 출력스트림에 남아있는 바이너리 데이터 모두 내보내기

void close() : 출력스트림 닫고, 관련된 시스템 자원 해제

 

3) FileInputStream

: 바이트 스트림으로 파일 읽는 스트림 클래스

 

#1. 생성자 

FileInputStream(File file) : file이 지정하는 파일로부터 읽어오는 스트림 생성

FileInputStream(String name) : name 지정하는 파일로부터 읽어오는 스트림 생성

 

#2. 주요 메서드

int read() :입력 스트림에서 한 바이트 읽어 int형으로 리턴

int read(byte[] b) : 최대 배열 b의 크기 만큼 바이트를 읽음

int availble() : 현재 읽을 수 있는 바이트 수 리턴

void close() : 스트림 닫고 관련 시스템 자원 해제

 

#EOF : End of File 파일의 끝

read()할때 EOF를 만나면 -1을 리턴

 

* read()의 리턴이 int 형인 이유

byte 0xFF(-1)

byte값 -1 int 로 리턴 : 0x000000FF 리턴

EOF -1 리턴 : 0xFFFFFFFF리턴 (32비트)

 

4) DataInput/OutputStream

: boolean, char, byte 등 기본타입의 값을 바이너리 형태로 출력.

바이너리 형태를 기본값으로 읽어옴

각 자료형에 맞는 값들을 입력/ 출력할 수 있는 메서드들이 존재

 

5) ObjectInputStream / ObjectOutputStream.  (잘 안쓴다 )

: 객체를 스트림에 입/출력하는데 사용하는 클래스

보조 스트림으로 사용

 

 

  1. 문자 스트림

- 자바형에서는 char형이 2바이트이기 때문에, 한글과 같은 2바이트 문자는 바이트 스트림으로 전송시 깨지는 경우가 있다.

이러한 점을 보완하기 위해 문자 스트림 제공

- 문자화되지 않는 바이너리 값은 처리불가 -> 이미지 같은것 처리불가

- 클래스들의 이름이 Reader/Writer로 끝남

- 메서드 리턴타입을 잘 보면 byte[]가 아닌 char[]을 사용하는것을 볼 수 있다.

 

1) Reader / Writer

:문자 스트림 클래스들의 부모. 추상클래스

 

2) OutputStreamWriter

: 파일에 텍스트데이터를 저장할 때 생성자 인코딩 지정하여 처리가능

인코딩을 지정하지 않으면 OS에서 디폴트로 사용하는 인코딩으로 데이터 저장.

 

#1 생성자 ( api 문서 참고)

charset = encoding : 문자셋

 

 

 

#2 주요 메서드 (바이트 스트림참고)

String getEncoding() : 인코딩값 리턴

void flush() : 스트림 비우기 ( 닫기전에 호출하기)

 

 

 

 

3) InputStreamReader

: 바이트 스트림을 문자 스트림으로 연결시켜주는 역할을 하는 보조 스트림

바이트 스트림의 데이터를 지정된 인코딩의 문자 데이터로 변환하는 작업 수행

 

#1 생성자 (api 문서 참고)

#2 주요메서드 (바이트 스트림 참고)

String getEncoding() : 인코딩값 리턴

 

  # 윈도우에서 사용하는 인코딩

MS949 :  마이크로소프트사에서 한글 국가 표준 코드를 확장해서

MS949라고 불리는 코드 체계를 만들고

윈도우 기본 문자 체계로 사용함.

 

 

4) BufferedReader

: 버퍼를 이용해서 입력의 효율을 높일 수 있도록 해주는 역할

readLine() 을 사용해서 데이터를 라인단위로 읽어 올 수 있다.

 

BufferedReader + InputStreamReader -> Scanner

 

 

6. OS

: 하나의 소프트웨어로, 소프트웨어들을 관리하는 소프트웨어(App)

windows, linux, iOS,  android, unix, MacOS

 

자바 -> JVM : 자바 App을 관리하는 소프트웨어

 

 

7. Thread 스레드

1) 프로세스 process

현재 실행중인 프로그램이다.

프로그램이 실행하면 OS로 부터 실행에 필요한 자원(메모리) 를 할당받아 프로세스가 된다.

프로세스 = 프로그램을 수행하는데 필요한 메모리 같은 자원 + 스레드

자원을 이용하여 “실제로 작업을 수행하는것이 스레드” 이다.

 

싱글 프로세스 = 하나의 프로그램을 돌리기위해 1개의 프로세스가 실행되는것.

멀티 프로세스 = 하나의 프로그램을 돌리귀해 여러 프로세스가 실행되는것.

 

2) 멀티태스킹 multitasking : multi + tasking

태스크 task = 프로세스가 하는 일

태스킹 = 포로세스가 일을 하는것

멀티태스킹 = 하나의 프로세스가 여러일을 하는것

 

 

3) 스레드 thread

하나의 태스크를 수행하는 일꾼

프로세스 = 공장(자원 + 일꾼), 스레드 = 일꾼 

싱글스레드 = 자원 + 일꾼

멀티 스레드 = 자원 + 일꾼 + 일꾼 ….

둘 이상의 스레드를 가지고 있는것을 멀티스레드 프로세스라고 부른다

(multi-thread process)라 부른다.

 

하나의 프로세스가 가질 수 있는 스레드의 개수는 제한되어있지는 않으나

스레드가 작업을 수행하는데 개별적인 메모리 공간을 필요로 하므로

프로세스의 메모리 한계에 따라 생성될 수 있는 스레드의 수가 결정된다,

 

4) 멀티태스킹과 멀티스레딩

멀티태스킹을 실현하기 위한 2가지 방법

- 멀티 프로세싱  : 하나의 프로그램을 여러개의 프로세스로 구성 

-> 각 프로세스가 하나의 작업을 처리하도록

-> 단점 : 프로세스간 변수 공유 X -> 통신으로 공유해야함

통신이 어렵고, 문맥교환에 따른 과도한 작업량 소요될수도..

 

 

- 멀티 스레딩 : 하나의 프로그램을 동시 처리 가능하게 작업을 분할하고 

작업의 개수만큼 스레드를 생성, 스레드 하나당 하나의 작업처리하게함

자원과 메모리 공유, 문맥교환 빠름

 

활용분야

- 웹서버 시스템

- 워드, 한컴

 

5) 자바의 멀티스레딩 

JVM이 알아서 한다.

8. 스레드 만들기

# 개발자가 할일 

1) 스레드 할일 코드로 작성

2) JVM에게 스레드 생성하고 코드 실행하도록 요청

 

# 구현방법

1) Thread 클래스 상속받아 스레드 만들기

java.lang.Thread

# 1. 생성자 (문서참고)

# 2.  주요 메서드

void run() : JVM에 의해 호출 (핵심 메서드)

스레드가 해야할 작업을 구현해놀는 메서드 

개발자는 반드시 이 메서드 오버라이딩하여 스레드가 할일을 코드로 작성햐야함

이 메서드가 종료하면 스레드도 종료.

 

void start() : JVM에게 스레드 실행하도록 요청하는 메서드

void interrupt() : 스레드 강제 종료

static void yield() : 다른 스레드에게 실행을 양보

void join() : 스레드 종료할때까지 기다린다.

long getId() : 스레드 id값 리턴

String getName() : 스레드 이름 리턴

int getPriority : 스레드의 우선순위값 리턴 1~10사이 값

void setPriority(int n) : 스레드의 우선순위 n으로 변경

Thread.State getState() : 스레드의 상태값 리턴

static void sleep(long mills) : mills 밀리초동안 스레드 잠재우기

static Thread currentThread() : 현재 실행중인 스레드 객체의 레퍼런스 리턴

# 1. 스레드 클래스 상속 받은 클래스 작성

# 2. run() 메서드 오버라이딩 : 스레드가 할일 작성

# 3. 스레드 객체 생성

# 4. 스레드 시작 : start() 호출

 

 

2) Runnable 인터페이스 구현 

java.lang.Runnable

 

# 1. Runnable 인터페이스 구현하는 클래스 선언

# 2. run() 오버라이딩 : 스레드가 할일 작성

# 3. 객체 생성

Thread th = new Thread(new 우리가 만든 클래스명());

# 4. 스레드 시작 : start()

 

 

 

9. 스레드 생명 주기

1) 스레드 상태

Thread Life Cycle : 스레드 생명 주기 갖고 있고, 상태 6가지로 표현

 

NEW : 스레드 탄생. new Thread()

RUNNABLE : 스레드가 현재 실행되고 있거나, 실행 준비되어 스케줄링 기다리는 상태

WIMED_WAITING : 스레드가 sleep(n)을 호출하여 n 밀리초 동안 기다리면서 멈춘 상태.

BLOCK : 스레드가 I/O 작업을 실행하여 I/O 완료기다리면서 멈춘 상태

WAITING : 스레드가 어떤 객체에 대해 wait() 호출하여; 다른 누가 notify()로 깨워줄때 까지 무한정 기다리는 상태

 

TERMINATED :  스레드 종료한 상태

 

728x90
728x90

4. 예외 처리 Exception handling 
: 코드로 발생할수있는 에러를 미리 진단하고, 해결방안을 처리해 놓는것. 
- 컴파일 에러 : 컴파일할때 발생(실행조차X) : 문법 오류 등  
- 런터임 에러 : 실행하다 발생 : 문법적으로는 맞아 컴파일은 되는데 실행하다 발생 

1) 예외는 메서드에서 처리. 
2) try-catch 구문 (****api쓰면서 정말 많이 쓸꺼다*****)

try {
// 예외가 발생할것 같은 코드들....
}catch(NullPointerException e) {
// 예외 발생하면 대처해야할 코드들....
}catch(ArrayIndexOutOfBounds e) {
// 예외 발생하면 대처해야할 코드들....
}catch(Exception e) {
// 예외 발생하면 대처해야할 코드들....
}

3) 대표적인 예외 
ArrayIndexOutOfBoundsException : 배열 인덱스번호 잘못 쓰면 
ArithmeticException : 0으로 나눌려고 할때 
NullPointerException : 객체 생성안하고 내용물 사용하려고 할때 
NumberFormatException  : 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환시 발생 
ClassCastException : 클래스 형변환 에러 
ClassNotFoundException : 찾는 클래스가 없을 경우 
IOException : 입출력 동작 실패 또는 인터럽트 시 발생 
IllegarArgumentException : 인자 전달 실패시 

4) finally
예외 발생 여부와 상관없이 무조건 실행되는 블럭 
메서드안에서 return을 만나도 finally 블럭이 있으면 
실행하고 return됨. 


try {
// 예외가 발생할것 같은 코드들....
}catch(Exception e) {
// 예외 발생하면 대처해야할 코드들....
}finally {
// 예외 발생 여부 상관없이 무조건 실행되야하는 코드들.....
}

5) 예외 발생시키는 키워드 

throw 예외객체; 

Exception e = new Exception(); 
throw e; // 예외 발생이야~~~~~~~~

 

 

package day14;

public class ClassEx34 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
/*		int number = 100;
		int result = 0;
				//for문을 안으로 넣어도 되고
		try {result = number / (int)(Math.random()*10);
 * 			for(int i = 0;i < 10; i++) {
				System.out.println(result);
			
		}catch(Exception e) {
			System.out.println("0 발생");
		}
		
 * 
 * 
 */				//
		int number = 100;
		int result = 0;
		// 밖으로 빼도되고 단 결과는 다르다
		for(int i = 0;i < 10; i++) {
			try {result = number / (int)(Math.random()*10);
				System.out.println(result);
			
			}catch(Exception e) {
			System.out.println("0 발생");
			}
		
		}
	}
}

 

package day14;

import java.util.Scanner;

public class ClassEx35 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub


		Scanner sc = new Scanner(System.in);
		System.out.println("3줄 입력");
		String s1 = sc.next();
		String s2 = sc.next();
		String s3 = sc.next();
		System.out.println(s1);
		System.out.println(s2);
		System.out.println(s3);
		sc.nextLine();
		System.out.println("주소를 입력");
		String addr = sc.nextLine();
		System.out.println(addr);
		System.out.println("종료");
		
		sc.close();
	}
}

 

package day14;

public class ClassEx36 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			
		System.out.println(1);
		try {
			System.out.println(2);
			System.out.println(0/0);
			System.out.println(3);  //건너뜀
		}catch(Exception e) {
			System.out.println(4);
			
		}finally {
			System.out.println(5);
	}
			System.out.println(6);
	}
}
package day14;

public class ClassEx37 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		try {
			System.out.println("hello");
			throw new Exception("고의로 발생");   // 의도적 예외를 발생시켜서
			//System.out.println("java"); //밑에 이줄은 출력안돼~!
		}catch(Exception e){
			System.out.println(e.getMessage());
			e.printStackTrace(); // 빨간줄 일부러 보여주는 
			System.out.println("Exception 발생");
		}
	}
}
 

package day14;

public class ClassEx38 {
					    //예외 발생하는것 부른쪽으로 토스 
	static void add() throws Exception {
		
	System.out.println("add 실행");
	throw new Exception();
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			
		//add();
	
	}
}
package day14;

public class ClassEx39 {

		static void method1() throws Exception {
			method2();
		}
		static void method2() throws Exception {
			throw new Exception();
		}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			
			method1();
		}catch(Exception e) {
			System.out.println("처리할께");
			e.printStackTrace();
		}
	}
}
package day14;

public class ClassEx40 {
	
	static void method1() throws Exception {
		try {
		
			throw new Exception();
		}catch(Exception e) {
			System.out.println("method1 예외처리!!!");
			 throw e; // 또 문제를 만들어냄 !
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			method1();
		}catch (Exception e) {
			System.out.println("main 에서도 잡기");
		}
	}
}
728x90
728x90

#2. Calendar의 get(), set() 메서드에 사용되는 상수
YEAR : 년도
DAY_OF_MONTH : 한달의 날짜
MONTH : 달(0~11)  0-> 1월
DAY_OF_WEEK : 한주의 요일
HOUR : 시간 (0~11) 0-> 1시
AM_PM : 오전/오후
HOUR_OF_DAY : 24시간 기준으로 한 시간
MINUTE : 분
SECOND : 초
MILLISECEND : 밀리초 (1초 =1000밀리초)

#3.Gragorian Calendar 클래스
1970.1.1.0.0.0을 기준으로 365.25일 (4년에 1번씩 윤달)


2) Date 클래스 (비추천, 하지만 아직까지많이 쓴다)
: 단일 클래스로 날짜/시간 관련 클래스
1900.1.1.0.0.0을 기준,
1970.1.1.0.0.0을 기준

 

package day15;

import java.util.Calendar;
public class ClassEx47 {

		static String toCalString(Calendar date) {
			return date.get(Calendar.YEAR) + "년" +
		(date.get(Calendar.MONTH)+1) + "월"+ (date.get(Calendar.DATE))
 +"일";	 	}
	
	public static void main(String[] args) {
		
			Calendar now = Calendar.getInstance();
			System.out.println(now);
		
		//년도와 월 알아내기
		int year = now.get(Calendar.YEAR);	
		int month = now.get(Calendar.MONTH)	+1 ; //0~11월 : 0 -> 1월
		System.out.println("year : " +year );
		System.out.println("month : " +month );
		System.out.println();
		
		// 일 = 1, 월 =2 
		final String[] DAY_OF_WEEK = {"","일","월","화","수","목","금","토","일"};		
		System.out.println(toCalString(now));
		System.out.println(DAY_OF_WEEK[now.get(Calendar.DAY_OF_WEEK)]+"요일");
		
		Calendar date1 = Calendar.getInstance();
		date1.set(2022,12,25);  //올해 크리스마스로 세팅
		System.out.println(toCalString(date1)+""+ DAY_OF_WEEK[date1.get(Calendar.DAY_OF_WEEK)]);

	}

}

 

 

package day15;
import java.util.Calendar;
public class ClassEx48 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Calendar time1 = Calendar.getInstance();
		Calendar time2 = Calendar.getInstance();
		
		
		
		// time1 : 10시 20 분 30초
		time1.set(Calendar.HOUR_OF_DAY, 10);
		time1.set(Calendar.MINUTE, 20);
		time1.set(Calendar.SECOND, 30);
		
		//time2  :  20시 30분 10초
		time1.set(Calendar.HOUR_OF_DAY, 20);
		time1.set(Calendar.MINUTE, 30);
		time1.set(Calendar.SECOND, 10);
		
		
		System.out.println(time1.getTimeInMillis());
		System.out.println(time2.getTimeInMillis());
		long differ = Math.abs(time1.getTimeInMillis() - time2.getTimeInMillis()/1000);	
		System.out.println(differ);
		
		final int [] TIME_UNIT= {3600,60,1};
		final String[] TIME_UNIT_NAME = {"시간","분","초"};
		System.out.print("tim1 1 과 2 차이는 ");
		String tmp = "";
		for(int i=0;i<TIME_UNIT.length; i++) {
			tmp += differ/TIME_UNIT[i] + TIME_UNIT_NAME[i];
		}
		System.out.println(tmp + "입니다");
			
	}
}

 

package day15;

import java.util.Calendar;

public class ClassEx49 {
	static String toCalString(Calendar date) {
		return date.get(Calendar.YEAR) + "년" +
	(date.get(Calendar.MONTH)+1) + "월"+ (date.get(Calendar.DATE))
+"일";	 	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		
		Calendar date = Calendar.getInstance();
		date.set(2022, 7,31);  //2022 8월 31
				System.out.println(toCalString(date));
				System.out.println("1일 후");
				date.add(Calendar.DATE, 1);
				System.out.println(toCalString(date));
				
				System.out.println("6달전");
				date.add(Calendar.MONTH,-6);
				System.out.println(toCalString(date));
				
				System.out.println(" 31 일 후 roll");
				date.roll(Calendar.DATE, 31);
				System.out.println(toCalString(date));
				date.add(Calendar.DATE,31);
				System.out.println(toCalString(date));
	}
}
package day15;

import java.text.SimpleDateFormat;
import java.util.Date;

public class ClassEx50 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Date day = new Date();  // 오늘 현재 시각  값을 지정해서 객체 생성
		System.out.println(day);
		System.out.println(day.getMonth()+1);
		
		
		// 날짜 포맷(형태)를 원하는 형태로 변경해서 사용을 원할때
		SimpleDateFormat abc1 = new SimpleDateFormat("yyyy-MM-dd");
		SimpleDateFormat abc2 = new SimpleDateFormat("yy년-MM월-dd일");
		System.out.println(abc1.format(day));
		System.out.println(abc2.format(day));
		
	}
}

 

 

 

package day15;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class ClassEx51 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		
		
			// 날짜 입력받아 현재 시간과의 차이 출력
			String pattern = "yyyy/MM/dd";
			DateFormat ab= new SimpleDateFormat(pattern);
			
			Scanner sc = new Scanner(System.in);
			
			Date inputDate = null;
			System.out.println("날짜를 " + pattern + "의 형태로 입력하세요");
			// inputDate = ab.parse(sc.nextLine());
			while(sc.hasNextLine()) {
				try {
					inputDate = ab.parse(sc.nextLine());
					break;
				}catch(Exception e) {
					System.out.println("날짜를 " + pattern + "형태로 다시 입력");
				}
			}
			//System.out.println(inputDate);
			Calendar cal = Calendar.getInstance();
			cal.setTime(inputDate); // Date -> Calendar
			Calendar now = Calendar.getInstance(); // 현재시각
			
			long hours = Math.abs(cal.getTimeInMillis() - now.getTimeInMillis())/(1000*60*60);
			System.out.println(hours);
	}
}
728x90

'P-Language > [Java]' 카테고리의 다른 글

[Java] 17 - 입출력 스트림(Input/Out Stream)  (0) 2022.06.11
[Java] Hashmap Exercises  (0) 2022.06.07
[Java] 16 - 컬렉션 (해쉬맵, 어레이리스트)  (0) 2022.06.03
[Java] 15 - 패키지와 API  (0) 2022.06.03
[Java] 14 - 싱글턴  (0) 2022.06.03
728x90

[day16]

1. 컬렉션 Collection
JDK는 소위 자료구조 과목에서 배우는 많은 자료 구조들을 컬렉션으로 만들어 제공
제네릭이라는 기법으로 구현.

 

1)컬렉션을 위한 자바 인터페이스와 클래스 




[Collection]
- Vector, **ArrayList**  : 가변크기의 배열
- LinkedList : 노드들이 링크로 연결되는 리스트
- Stack : 스택
- HashSet: 집합

[Map]
- **HashMap** : 키와 값의 쌍으로 저장되는 컬렉션

2) 제네릭(generics) 기법
JDK1.5 부터 도입된 제네릭기법으로 컬렉션이 만들어짐
컬렉션들 이름에 <E><K><V>등이 포함 -> 타입매개변수(generic type)
ArrayList<Integer>  -> 정수만 저장하는 ArrayList
ArrayList<String>   -> 문자열만 저장가능하는 ArrayList

특정타입만 다루지 않고 여러종류의 타입으로 변신할 수 있도록 <E>을 사용
단, int, char, double등 기본타입으로는 제네릭 사용 불가!!
-> Integer, Character, Double 등 Wrapper 클래스로 지정해줘야함.
제네릭 객체형으로 기본형이랑은 안맞음
ArrayList<int>  (X)  -> ArrayList<Integer>

ex) 제네릭 타입을 가진 클래스
class Stack<E>{
.... void push(E element){.....}
E pop(){....}
}
E에 대한 구체적인 타입을 지정하면 지정된 타입만 다룰 수 있는 구체화된 스택이 된다.
-> 정수 스택 Stack<Integer>
void push(Integer element){...}
Integer pop(){...}

-> 문자열 스택 Stack<String>
void push(String elemet){...}
String pop(){...}
-> Tv 스택 Stack<Tv>
void push(Tv element){...}
Tv pop(){...}

E : element 요소
T : type
V : value
K : key

3) ArrayList<E> : java.util.ArrayList
: 가변 크기의 배열을 구현, vector와 거의 동일.
삽입되는 요소의 개수에 따라 자동 크기 조절.
요소 삽입/삭제에 따라 요소들의 자리 이동도 자동으로 처리.

# 주요 메서드
boolean  add(E elem) : 맨뒤에 elem 추가
void add(int idx, E elem) : idx위치에 elem 추가
boolean addAll(Collection c) : 컬렉션 c의 모든 요소를 뒤에 추가
void  clear() : 모든 요소 삭제
E remove (int idx) : idx 위치 요소 하나 삭제
boolean remove(Object o) : o와 같은 요소 삭제
E elemenAt(int idx) : idx 위치요소 리턴
E get(int idx) : idx 위치요소 리턴
E set(int idx, 값) : 수정전의 인덱스 값 리턴
boolean contains(Object o) : o를 포함하고 있으면 true
int  indexOf (Object o) : o와 같은 요소가 저장된 첫 인덱스 리턴, 없으면 -1 리턴
boolean isEmpty() : ArrayList가 비어있으면 true
int size() : 저장된 요소의 개수 리턴
Object[] toArray() : 저장된 요소를 배열로 리턴

 

package day16;

import java.util.ArrayList;

public class ClassEx52 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		
		// ArrayList 객체생성
		// 컬렉션명<제네릭 타입> 변수명 = new 컬렉션명<타입>();
		ArrayList<Integer> list = new ArrayList<Integer>(10);
		// ArrayList<int> list = new ArrayList<int>(10); 기본형으로 타입지정불가
		
		// #2. 요소삽입
		list.add(10);
		list.add(20);
		list.add(30);
		list.add(null); //null 삽입가능 주의
		list.add(3, 100); //원하는 인덱스 위치에 삽입가능
		
		System.out.println(list);
		
		//#3. 요소 꺼내기
		Integer i = list.get(0); // 리턴타입 그대로 받기
		int ii = list.get(1);    // 언박싱해서 기본형으로 받기
		System.out.println(i);
		System.out.println(ii);
		
		// #4. 요소의 개수
		int size = list.size();
		System.out.println(size);  //5개
		
		// #5. 요소의 삭제
		list.remove(2);
		System.out.println(list);
		//list.remove(10)        remove(Obeject o): 요소같은거 삭제 에러발생
		list.remove(new Integer (100));    //요소와 같은거 삭제시 객체로 전달해야함
		//기본형값 -> index, 객체값 -> 값으로 인식
		System.out.println(list);
		
		list.clear();
		System.out.println(list); // []
		System.out.println(list.isEmpty()); //true
		System.out.println(list.size());  // 0

	}
}




4) 제네릭 없이 사용
제네릭 없이 사용하면 다양한 타입의 요소를 같이 저장가능.
제네릭을 지정하지 않았기 때문에
모든 객체의 최상위 클래스인 Object형으로 처리된다.  // 대신 형변환 해서 꺼내써야한다. 


5) Vector<E> : java.util.Vector<E>
: 가변 배열 구조, ArrayList와 거의 동일
Vector는  스레드간 동기화 지원, ArrayList는 스레드간 동기화 지원 X



6) Iterator<E> : java.util.Iterator<E> 인터페이스 : 반복자
: Vector, ArrayList 등과 같이 컬렉션에 저장된 요소를 
순차적으로 검색할때 사용하면 편리함.

#주요 메서드
boolean  hasNext() : 다음 요소가 있으면 true
E next() : 다음요소를 가르키고 다음 요소를 리턴
void  remove() : 리턴된 요소 제거


7) **HashMap<K, V> : java.uti.HashMap ***
: 키(key)와 값(value)의 쌍으로 구성되는 요소들을 저장할 수 있는 자료구조.
K는 키로 사용할 데이터의 타입, V의 값으로 저장할 데이터의 타입을 제네릭으로 명시한다.

-> index가 없다. index 대신 key값으로 value를 꺼내옴
-> inderx를 사용자가 원하는 값으로 지정하는 사용자 지정 index라고 할 수도 있다.
-> key값 중복 허용 안되고, 순서가 없다.

#장단점
- 삽입, 삭제 시간이 매우 빠르다. 
위치를 결정하는 해쉬함수가 간단한 코드로 구성되어있고,
vector나 ArrayList 처럼 삽입, 삭제시 요초 위치 이동이 필요없기 때문
- 검색은 더욱 빠름
해쉬함수가 key 저장 위치를 바로 찾기 때문에
vector나 ArrayList처럼 모든 요소를 하나씩 비교하는 시간 낭비가 없다.

#주요 메서드
V  put(K key, V value) : key와 value 쌍으로 데이터 저장
V get(Obeject key) : 키에 해당하는 value 값 리턴, 없으면 null리턴
V remove(Object key) : 키를 찾아 키+밸류 삭제 
void clear() : 모든 요소 삭제
int size() : 요소의 개수 리턴
boolean isEmpty() : 요소가 하나도 없으면 true
      **Set<K>** keySet() : 모든 키들만 담아서 Set<K> 타입으로 리턴
boolean containKey(Object key) : key를 포함하고 있으면 true
boolean containValue(Object key): value에 일치하는 값이 있으면 true


8) LinkedList<E> 
: 요소들을 양방향으로 연결하여 관리한다는 점을 제외하고는
Vector, ArrayList와 거의 같다.
맨앞과 맨 뒤를 가르키는 haed, tail 레퍼런스 가지고있다.

9) Stack<E>
: Vector의 자식 클래스.
제한적으로 접근할 수 있는 나열식 구조로, 접근 방법은 마지막에서만 접근가능
LIFO (Last In First Out)


Queue<E> : FIFO(First In First Out)

10) Set<E> 인터페이스 -> HashSet<E> 구현 클래스
: 순서가 없고, 중복 데이터가 없는 컬렉션.
-> 동일한 값을 저장할 수 없다.

11) Properties 클래스
: HashMap의 구버전인 HashTable을 상속받아 구현한 클래스
K, V 형태로 데이터를 저장 (K = String, V = String)
주로 어플리케이션의 환경 설정과 관련된 속성을 저장하는데 사용한다. (컴파일안해도됨)

.properties 확장자를 가진 파일의 내용을 읽어들일때 유용한 클래스.

#주요 메서드
String  getProperty(String key) :키주고 값 꺼내기
Object setProperty(String key, String value)  : 키, 밸류 세트로 데이터추가
void load(InputStream inStream) : 외부파일을 스트림으로 읽은것 k,v 형태로 로딩함)



C Create : 생성 add()
R read   : 읽기 get()
U Update : 수정
D Delete : 삭제 remove() / clear()

728x90

'P-Language > [Java]' 카테고리의 다른 글

[Java] Hashmap Exercises  (0) 2022.06.07
[Java] 15 - 1 Calendar API  (0) 2022.06.04
[Java] 15 - 패키지와 API  (0) 2022.06.03
[Java] 14 - 싱글턴  (0) 2022.06.03
[Java] 13 - 12의 문제풀이  (0) 2022.06.03
728x90

[day15]

1. 패키지 package
: 폴더 디렉토리 : 서로관련있는 클래스나 컴파일된 클래스 파일들을 한 곳에 묶어 놓은 것.
JDK는 개발자에게 많은 클래스 파일들을 패키지 형태로 제공 .jar 압축파일로 제공됨

1) 클래스 명
클래스를 지칭할때는 패키지명을 포함하는 경로명을 사용한다.
패키지와 클래스 사이는 점(.) 연산자로 표현

java.lang.Object

2) 패키지 필요성
소스파일을 목적에 맞게 구조적으로 관리하여
유지보수를 편하게 한다.

3) 패키지 사용
기본적으로 클래스 사용시, 패키지 명을 포함한 전체 경로명을 기술해야한다.
ex) Scanner 
java.util.Scanner sc = new java.util.Scanner(System.in);

4) import 문
import 패키지. 클래스명; 
한 패키지에 있는 여러 클래스들을 import 하고자 하는 경우,
import 패키지명.*;
위와같이 클래스명대신 *을 사용하여 선언가능
* : 모든 ~~~

ex)
import java.util.Scanner;
Scanner sc = new Scanner(System.in);

5) package 만들기
package 패키지명; 

이 클래스는 저 패키지 안에 포함되어있다!

dafault package : package 선언하지 않은 경우 현재 디렉토리를 인지함

2. API Apllication Programming Interface
: 자바에서도 제공해주는 기본 패키지 : Java API
JDK 설치하면 개발자들이 사용할 수 있도록 오라클에서 미리 만들어 놓은 많은 클래스들을 패키지로
제공한다.

1) API문서
#Java SE(Standard Edition)
https://docs.oracle.com/en/java/javase/11/docs/api/

#Java EE(웹)
https://docs.oracle.com/javaee/7/api/toc.htm (Java EE7)
https://javaee.github.io/javaee-spec/javadocs/   (Java EE8)

2) API
java.awt : GUI 관련 클래스.
java.beans : == 컴포넌트 클래스
java.io : input/output (I/O) 데이터를 내보내고 들여보내는 것
**java.lang** : 기본패키지 * (자동적으로 import됨 자주쓰는애들)
java.math : 기본연산 이외에 더 큰 다양한 연산등이 필요할때
java.net  : 네트워크 관련
java.nio  : new I/O
java.security : 보안관련 
java.sql  : 데이터 베이스 관련
java.text : 글자 관련 
**java.util** : 배열을 대신하는 클래스 이 곳의 위치, 날짜, 벡터, 해시맵, 간단한 입출력등

javax.~~  : 서포트하는 클래스

그 외,
구글 API : https://console.cloud.google.com/apis/library?project=concise-reserve-268502
네이버 API : https://developers.naver.com/main/
카카오 API : https://developers.kakao.com/
공공데이터 포털 : https://www.data.go.kr/


3. java.lang
import 필요없음.
System 을 비롯하여 문자열, 수학함수, 입출력등 과 같이
자바 프로그래밍에 필요한 기본적인 클래스와 인터페이스 제공한다.

1) Object 클래스 : 최상위 클래스
모든 클래스의 조상, 모든 클래스에 강제로 상속되는 부모.

  clone  : 복사
equals(object 던져주는애): 어떤 객체가 같은 파일인지(주소)
finalize:  비추
hashcode  해쉬코드를 주는 애
toString 해쉬코드 문자열로 주는애 (주로 오버라이딩해서 씀)
wait 쓰레드를 잠재워줌

#주요 메서드
String toString()
boolean equals(Object obj)


2) String 클래스
문자열 클래스
스트링 리터럴은 자바 컴파일러에 의해 모두 String 객체로 처리

#1. 생성자
String() : 기본 생성자, 빈 스트링객체 생성
String(String org): String 타입의 문자열 저장하면서 객체 생성
String(char[] value) : char 배열의 문자들을 스트링 객체로 생성
String(StringBuffer buffer) : 스트링버퍼 문자열을 스트링 객체 생성

3) 스트링 리터널과 new String()
스트링리터널과 new String() 으로 생성된 객체는 서로 다르게 관리된다.
스트링리터널 String str = "hello";
-> 자바 배누에서 리터럴 테이블로 특별 관리하여 동일한 리터럴 공유함.

new String() String Str = new String("hello");
-> new로 생성된 스트링은 다른 객체와 동일하게 heap 메모리에 생성

4) 스트링 객체 수정 불가능
리터럴이던, new String() 이던 수정 불가
수정 => 스트링 객체 만들어 덮어쓰기


5) 주요메서드
 리턴타입  메서드명 설명
char charAt(int idx) : index에 있는 문자 값 char 로 리턴
boolean         equals(String str) : 문자열 비교
int  compaerTo(String other) : 두 문자열을 사전순으로 비교,
같으면 0, 현자문자열이 먼저나오면 음수, 아니면 양수리턴
String concat(String str) : 현재문자열뒤에 str 매개변수 문자열 이어준 
새로운 문자열 리턴
boolean  contains(CharSequence s) : S에 지정된 문자를 포함하면 true, 포함안하면 false 리턴
int  length() : 문자열 길이 리턴
String  replace(CharSequence target, CharSequence replacement)
 : target을 replacemetn로 변경한 문자열 리턴

String[]  split(String regex) :regex 정규식에 일치하는 부분을 구분자로 
문자열을 분할하여 배열로 리턴
*자주씀* String subString(int beginIdx) : beginIdx 인덱스번호부터 끝까지 문자열을 잘라서 리턴
String toLowerCase() : 전체 소문자로 변경해 리턴
String toUppercase() : 전체 대문자로 변경해 리턴
String trim() : 문자열 앞뒤 공백 제거하고 문자열 리턴(중간은 x)

6) StringBuffer 클래스  (우리 수업에는 잘안씀)
문자열 다루는 클래스
String과 다르게 StringBuffer객체는 문자열을 저장하는 가변 버퍼를 가지고 있다.
문자열 수정가능.

7) Wrapper 클래스
: Wrapper 라는 이름의 클래스는 존재하지 않는다
int, char, double 등 의 8개의 기본형을 객체로 다루기위해
JDK에 만들어진 8새의 클래스를 통칭해서 Wrapper 클래스라 함.


기본타입 : byte short int       long char       float double boolean
Wrapper  : Byte Short Integer   Long Character  Float Double Boolean

#1. 객체 생성
클래스명 참조변수명 = new 클래스명(값);

#2. 주요메서드
static int     parseInt(String s) : 문자열을 10진수로 변경
static int     parseInt(String s , int radix) : s를 radix 진법 정수로 변경한 값 리턴
static String toBinaryString(int i) :이진수로 변환한 문자열 리턴
static String  toHexString(int i) :16진수로 변환한 문자열 리턴
static String  toOctalString(int i) :8진수
static String  toString(int i ) :문자열로 리턴

float   floatValue()  : float으로 리턴
int  intValue() : int로 리턴
long longValue() : long으로
shor  shortValue()    : short으로 

#3. 박싱 / 언박싱

<박싱> 10이라는 숫자를 ten이라는 객체에 넣기
Integer ten =  new Integer(10);
int ----------> Integer 객체
10 10


<언박싱>
int n = ten.intValue();

8) Math 클래스
: 수학 관련 클래스
모든 메서드가 static 타입으로 객체생성없이 바로 사용가능
Math.메서드명();


4. java.util
1) Calendar 클래스
: 추상클래스 (객체생성 불가능)
년, 월, 일 요일, 시간, 분, 초, 밀리초 등을 get(),set 메서드를 이용해서 저장하거나
알아낼 수 있는 클래스
1970.1.1.0.0.0 을 기준으로

#1. 객체생성 X
getInstance() 메서드를 통해 Calendar 얻어와서 사용

#2. Calendar의 get(), set() 메서드에 사용되는 상수
YEAR : 년도
DAY_OF_MONTH : 한달의 날짜
MONTH : 달(0~11)  0-> 1월
DAY_OF_WEEK : 한주의 요일
HOUR : 시간 (0~11) 0-> 1시
AM_PM : 오전/오후
HOUR_OF_DAY : 24시간 기준으로 한 시간
MINUTE : 분
SECOND : 초
MILLISECEND : 밀리초 (1초 =1000밀리초)

#3.Gragorian Calendar 클래스
1970.1.1.0.0.0을 기준으로 365.25일 (4년에 1번씩 윤달)


2) Date 클래스 (비추천, 하지만 아직까지많이 쓴다)
: 단일 클래스로 날짜/시간 관련 클래스
1900.1.1.0.0.0을 기준,
1970.1.1.0.0.0을 기준

package day15;

class AClass{}
public class ClassEx41 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Object obj = new Object();
		
		AClass a = new AClass();
		
		System.out.println(a.getClass());
		System.out.println(a.hashCode());
		System.out.println(a.toString());
		System.out.println(a.getClass().getName()+"@"+Integer.toHexString(a.hashCode()));

	}
}
package day15;

class Point{
	int x, y;
	Point(int x , int y){
		this.x = x; this.y =y;
	}
	@Override
	public String toString() {
		return "(" + x + ","+ y + ") ";
		
	@Override
	public boolean equals(Object obj) { //obj가 들고있는 실제 객체가  Point 객체라면
		boolean result = false;     // 형변환해서 담고
		if(obj instanceof Point) {
			Point p = (Point)obj;
			
		}
	
		if(x == obj.x && y == obj.y) { // 형변환 한 p와 현제매서드를 부른 객체와 비교
			result = true;
			
		}
		return result;
	
	}
}
public class ClassEx42 {
	
	
	
	public static void main(String[] args) {
		Point p1 = new Point(1,3);
		Point p2 = new Point(1,3);
		System.out.println(p1.equals(p2)); //주소비교 false
		Point p3 = p1;
		System.out.println(p1.equals(p3)); //주소비교 true
		
		
	}
		static void print(Object obj) {
			System.out.println(obj.getClass().getName());
			System.out.println(obj.hashCode());
			System.out.println(obj.toString());
			System.out.println(obj);
		
		Point p = new Point(2, 5);
		// TODO Auto-generated method stub
		print(p);
		
		Object obj = new Object();
		print(obj);
	}
}

 

 

package day15;

public class ClassEx43 {

	public static void main(String[] args) {
		
		// 리터럴 방식
		String a = "hello" ;
		String b = "hello" ;
		if(a==b) { // 리터럴 방식은 주소가 같아서 ==으로 비교해도 같다고 나옴
				System.out.println("a==b");
				}
		
		if(a.equals(b)) {//문자열 값비교
			System.out.println("a equals b");
		}
		System.out.println();
		//System.out.println(System.identityHashCode(a)); 주소같음
		//System.out.println(System.identityHashCode(b));
		
		// 객체생성
		String c = new String("hello");
		String d = new String("hello");
		if(c==d) {
			System.out.println("c==d");
		}
		
		if(a.equals(b)) {//문자열 값비교
			System.out.println("c equals d");
		}
		//System.out.println(System.identityHashCode(c)); 주소다름
		//System.out.println(System.identityHashCode(d));
		System.out.println();
	
		
		// 문자열을 비교하고 싶다면 == 쓰지말고 equals 써야한다 !!!
		//		==는 주소비교
 	}
}

 

package day15;

public class ClassEx44 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			String str = "hello";
			char ch	=	str.charAt(2);
			System.out.println(ch);
			
			// 문자열 연결 : concat()
			String str2 = str.concat("java");
			System.out.println(str2);
			
			// 문자열 연결 : + 연산자
			String str3 = str + "java";
			System.out.println(str3);
			
			// 문자열 사전순으로 비교
			String java = "Java";
			String cpp = "C++";
			int res = java.compareTo(cpp);
			System.out.println(res);
			
			// 문자열 앞뒤 공백 제거 : trim()
			String a = "                abcd  efg ";
			String b = " bb            sdfef  d\t";
			System.out.println(a);
			System.out.println(b);
			// 앞뒤 공백제거 
			String c = a.trim();
			String d = b.trim();
			System.out.println(c);
			System.out.println(d);
					
			// 문자열의 길이
			String str4 = "hello";
				System.out.println(str4.length());
			// 문자열 바꾸기
			String str5 = "Apple Tree";
			String str6 = str5.replace("Apple", "Lemon");
				System.out.println(str6);
				
			System.out.println(str6.toLowerCase());
			System.out.println(str6.toUpperCase());
			
			// subString()
			String str7=str6.substring(4); // 시작번호는 포함
			System.out.println(str7);
			String str8 = str6.substring(4, 7);  // 끝번호 포함x(끝번호 전까지 잘라줌)
			System.out.println(str8);
			
			String [] words = {new String("hello"), new String("java"), new String("spring")};
			
			// 정수 -> 문자열
			int value = 100;
			String strValue = String.valueOf(value);
			
			// 정수 -> 문자열
			String strVal = value +"";
			
			// substring() : 파일명 나누기   (확장자 나눌때 자주쓰임)
			String fullName = "Hello.java";
			int index = fullName.lastIndexOf(".");   // 점의 위치를 찾음
			String name = fullName.substring(0,index);
			String ext = fullName.substring(index);
			System.out.println("파일명 : " + name);
			System.out.println("확장자명 : " + ext);
			System.out.println(index);
	}		
}

 

 

 

package day15;

public class ClassEx45 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Integer i = new Integer(10);   // 밑줄은 곧 사라질 기능이다라는거  46class 참고
		// Interger -> int
		int ii = i.intValue();
		System.out.println(ii);
		
		//문자열 -> 기본형
		int num = Integer.parseInt("132");
		boolean bool = Boolean.parseBoolean("true");
		
		//기본형 -> 문자열
		Character c = new Character('c');
		Double d = new Double(3.14);
		d.doubleValue();
		
		
		Boolean b= new Boolean(true);
		
		
		Character cc = new Character('c');
		Double dd = new Double(3.14);
	
		Boolean bb= new Boolean(true);
		
	}
}

 

 

package day15;

public class ClassEx46 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = 10;
		Integer ten = n;		//박싱   객체 <= 기본형
		System.out.println(ten);
		
		
		int num = ten+10;			//언박싱 기본형 <= 객체대입 
		System.out.println(num);
		
		Integer i =10; // new integer(10)   // 굳이 객체생성할 필요가없음
		Double d = 3.14;
		Boolean b = true;
		
		// 기본형 사용하듯 사용하면된다. (점 찍으면 api 기능도 있음)
		
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
728x90

[day14]

1. 싱글턴 Singleton (싱글인스턴스)  모두에게 도서관이 필요하다해서 여러개 지을 필요는 없다!
여기서 도서관은 인스턴스! (객체 =인스턴스(물품) + 클래스(설계도))

1) 싱글턴의 구성 요소 
1 - 자기 클래스 타입의 private static 변수 (객체 생성해 초기화) 
private static 클래스명 instance = new 클래스명(); 

외부에서 객체생성 못하니 내 안에 미리 만들고, 
자기 자신 타입으로 객체생성하므로 무한로딩에 빠지지 않게
한번만 로딩되라고 static붙혀 클래스 변수로 만든다.
함부로 외부에서 변수값 수정 못하게 private 해놓기 

2 - private 생성자 
private 클래스명() {...}

외부에서 이 클래스 객체 생성 못하게 
생성자에 private 붙히기 

3 - instance의 get 메서드 생성해서 공개
public static 클래스명 getInstance() {  
return instance; 
}

외부에서 객체 생성못하니,
메서드도 static 붙혀 클래스명.메서드명()으로 
사용가능하게, 그리고 어디서든 필요하면 사용가능하게
public으로 완전 공개

2. 내부 클래스 inner class , nested class (*이런게 있구나 정도만 알면됨)
클래스 내부에 또 다른 클래스를 정의하는 것. 
이유 : 은닉화를 위해 사용 

1) 구조
class 외부클래스 {
외부 변수; 
외부 메서드;

class 내부클래스 {
내부 변수;
내부 메서드;
}
}

2) 종류 : 클래스 정의 위치에 따라 구분 
1. 멤버 클래스 
1 - 인스턴스 멤버 클래스 
: A클래스 객체를 생성해야만 사용할 수 있는 B 내부 클래스 

class A {
class B {
B() {}
int x;
void method(){}
//static int y; 
//static void method2() {}
}
}

# 객체 생성 & 사용 
A a = new A(); 
A.B b = a.new B(); 
b.x = 10; 
b.method();

2 - static 멤버 클래스 
: A클래스를 통해 바로 접근 가능한 B 내부 클래스 

class A {
static class B {
B() {}
int x;
void method(){}
static int y; 
static void method2() {}
}
}

# 객체 생성 & 사용 
A.B b = new A.B(); 
b.x = 10; 
b.method(); 
A.B.y = 20; 
A.B.method2(); 

# 멤버 클래스도 하나의 클래스이므로 
컴파일하면 바이트코드파일(.class) 별도로 생성 
AB.class    2. 로컬(지역) 클래스   : method() 가 실행될때만 사용할 수 있는 B 내부 클래스    class A {  void method() {  class B {  B() {}  int x;  void method(){}  //static int y;   //static void method2() {}  }  # 객체 생성 & 사용  B b = new B();   b.x = 10;   b.method();   }  }   A1 B.class

3. 익명 클래스 anonymous class 
: 이름이 없는 클래스 
클래스를 정의하고 동시에 객체 생성해서 사용. 

변수의 초기값, 지역변수의 초기값, 매개변수의 매개값으로 주로 대입됨.
이벤트처리할때나 스레드 객체를 간편하게 생성할 목적으로 많이 활용됨.
단독으로 생성 불가, 클래스를 상속하거나 인터페이스를 구현해야 생성가능.

1) 구조 
new 클래스명() {
// 클래스 정의 
}

new 인터페이스() {

}



package day14;
class SingleT{
	static int b = 1;
	int a = 100;
	//싱글턴
	private static SingleT instance = new SingleT();
	private SingleT() {}
	public static SingleT getInstance() {
		return instance;
	}
	
	void func() {
		System.out.println("~~~");
	}
}


public class ClassEx31 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//SingleT sing = new SingT();
		SingleT sing = SingleT.getInstance();
		SingleT sing2 = SingleT.getInstance();
		
		sing.func();
		
		System.out.println(sing.a);
		sing.a= 123;
		System.out.println(sing.a);
				
	}
}




package day14;

public class ClassEx32 {

	
	interface MyInter{
		void func();

		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
			
			//	MyInter a = new MyInter();
			//	a.func();
		//-> 계속생성가능
			//MyInter 인터페이스 규겍에 맞는 
			// 구현 익명 클래스 만들어서 객체 생성하고, 메서드 호출!
			new MyInter() {
				@Override
				public void func() {
					System.out.println("MyInter의 func 구현부 ~~");
				}
			}.func();
		// 1회성 코드
	}
}




package day14;
class Person{
	void wake() {
		System.out.println("7시에 기상");
	}
	
}

class Anony{
	Person p2 = new Person();
	// 변수의 초기값 대입
	Person p = new Person() {
		void walk() {
			System.out.println("출근~~~");
		}
		@Override
		void wake() {
			System.out.println("6시에 기상!");
			
		}
	};
	
	void func() {
		//지역 변수의 초기값으로 대입
		Person localP = new Person() {
			@Override
			void wake() {
				System.out.println("8에 일어나서....");
				
				
			}
		};
		localP.wake();
	}
	void func2(Person person) {
		person.wake();
		
	}
}
public class ClassEx33 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Anony anony = new Anony();
		//anony.p.wake();
		//anony.p2.wake();
		
		anony.func2(new Person(){
			//void study() };
	}		
}















 

 

 

 

 

 

 

 

728x90

+ Recent posts