Archive

JS Day 3 ??연산자,변수,함수

|

JS Day 3 ??연산자,변수,함수


  1. null 병합 연산자

    • a ?? b 와 같이 쓰며 a가 null 혹은 undefined가 아니면 a를 반환, 반대는 b를 반환
    • ??연산자의 체이닝 (값이 있는 변수를 찾기 용이)
    let A = null;
    let B = null;
    let C = "안녕?"
       
    alert( A ?? B ?? C ); // '안녕?' 출력 
    
    • ?? 와 || 연산자 비교
    let money = 0;
    alert(money || 10000); //10000 출력, ||는 0을 falsy값으로 간주
    alert(money ?? 10000); //0 출력, money가 null,undefined가 아니므로 값 반환
    


  2. 지역변수(Local Variable)와 전역변수(Global Variable)

    • 함수 내에서 전역변수명과 같은 지역변수를 선언하면 지역변수에 가려진다
    let greet = 'Hi';
       
    function talk() {
        let greet = 'Hello'; //전역변수와 같은 이름의 변수 선언
        alert(greet);
    }
    talk(); //Hello 출력
    alert(greet); //Hi 출력, 전역변수가 바뀌지 않았다
    


  3. 매개변수의 default value

    • 함수의 매개변수에 직접 default value를 지정 할 수 있다. default로 다른 함수도 호출 가능
    function sayHello(to, text = "안녕?"){ //default value로 '안녕?' 설정
        alert(to + " , " + text);
    }
    sayHello("Lee"); //'Lee , 안녕?' 출력
       
    function sayHi(to, text = helloWorld()) {...} //이런식으로 함수 호출도 가능
    
    • 1번의 ?? 연산자로도 default value 설정 가능
    function sayHello(text){
        alert(text ?? '안녕?'); //text가 null or undefined면 '안녕?' 출력
    }
    sayHello(0); //0 출력
    sayHello(); //'안녕?' 출력
    


  4. 함수 표현식

    • 자바스크립트는 함수를 값으로 취급해서 다양한 미친짓(?)을 할 수 있다
    • 변수에 함수를 대입하거나 다른 변수에 넣어 함수를 복사 할 수도 있다
    • 일반적인 식을 함수 선언문, 아래 예시와 같은 식을 함수 표현식이라 한다
    let maxNum = function(a,b) {
        let result = (a>b) ? a : b;
        console.log(result);
    };
    alert(maxNum); //함수 그 자체가 문자열로 출력된다
       
    let findMax = maxNum;
    maxNum(2,3); //3 출력
    findMax(2,3); //3 출력
    


  5. 콜백 함수

    • 메인 함수의 매개변수에 함수를 넣어 연산식에 따라 함수를 나중에 호출하는 방식
    • 이때 나중에 called back되는 함수를 ‘콜백 함수’라 한다
    function calledBack(question, yes, no){
        confirm(question) ? yes() : no();
    }
    calledBack(
        "말해 yes or no",
    	function(){console.log('YES!')}, //yes일 경우의 콜백 함수
    	function(){console.log('NO!')} //no일 경우의 콜백 함수
    ); 
    


  6. arrow function

    • ES6의 문법으로 함수를 축약하여 표현할 수 있다
    • 실행문이 한 줄이면 {} 생략 가능
    • 매개변수가 한 개이면 () 생략 가능, but 매개변수가 없을때는 명시적으로 () 써야한다
    let sum = function(a,b){ //원래 같으면..
        return a + b;
    }
       
    let sum = (a,b) => a+b; //이 얼마나 아름다운가
    




참고 자료


JAVASCRIPT.INFO

Java Day 12 상속

|

Java Day 12 상속


  1. 상속

    • 클래스간의 기능을 확장이전 함으로서 코드의 중복을 줄여주고 유지보수성이 증대됨
    • 기본클래스(Base Class), 부모클래스(Parent Class), 상위클래스(Super Class) - 주는쪽
    • 유도클래스(Derivation Class), 자식클래스(Child Class), 하위클래스(Sub Class) - 받는쪽
    • 자바에서는 다중상속을 허용하지 않는다
    • 자식클래스는 extends 예약어를 사용하여 상속을 받음


  2. super() 생성자

    • 자식클래스가 생성될 때 눈에는 보이지 않지만 메모리상으로는 부모를 먼저 생성한 후 상속을 받아 생성된다. 따라서, 자식클래스는 부모 생성자를 호출함
    • 아무것도 적지 않아도 사실 자식 클래스의 생성자의 첫줄에 super();가 생략되어있는것
    • 만약 부모클래스의 기본생성자가 매개변수를 받는 경우 자식클래스의 super() 생성자도 같은 자료형의 매개변수를 받아야 컴파일오류가 안난다
    public class Human{
        public Human(int age){
            System.out.println(age);
        }
    }
    public class Women extends Human{
        public Women(){
            super(30); //super(); 매개변수 안받으면 compile error
        }
    }
    public class SuperEx{
        public static void main(String[] args){
            Women me = new Women(); //30 출력, 부모클래스의 생성자가 호출됨
        }
    }
    


  3. 오버라이드(Override)

    • 상위클래스의 메소드를 하위클래스에서 재정의
    • 오버로드(Overload)와 헷갈리니 주의, 오버로드는 하나의 클래스에서 같은 이름의 메소드 혹은 생성자를 인자,자료형 다르게 해서 재사용하는것
    • 오버라이딩은 부모의 메소드와 이름, 매개변수, 리턴타입이 같아야한다
    • 접근제한은 더 넓게만 가능하다 ex) 부모 : protected = 자식 : protected, public
    • 윗줄에 명시적으로 @Override 표기를 해주는 것이 좋다
    class CellPhone{
        public void cell(){
            System.out.println("음성 통화");
        }
    }
    public class SmartPhone extends CellPhone{
        @Override
        public void cell(){
            super.cell(); //부모 메소드 호출
            System.out.println("영상 통화");
        }
    }
        public static void main(String[] args){
                SmartPhone sp = new SmartPhone();
                sp.cell();
    }//음성통화, 영상통화 출력
    


  4. final 클래스, final 메소드

    • final 지정어가 붙은 클래스는 자식클래스에서 상속이 불가능하다 ex) String class..
    • final 지정어가 붙은 메소드는 자식클래스에서 오버라이딩 할 수 없다


  5. protected 접근제한자

    • protected가 붙은 메소드, 멤버, 생성자는 같은 패키지면 접근이 가능하지만 다른 패키지에서 접근하려면 해당 클래스를 상속받은 후 사용해야한다



참고 자료


이것이자바다

자바프로그래밍100% 실전가이드

KG아이티뱅크 자바 강의자료

2020-12-15 TIL

|

2020-12-15 TIL


  • 오늘 한 것
    1. 배열 응용문제 숙제 완료 - 어찌어찌 풀긴 풀었는데 긴가민가한 것들이 상당히 많다. 개념은 잡혀있는데 연습이 부족한 탓이겠지…문제를 많이 풀면서 완전히 내 것으로 흡수를 해야겠다.
    2. 학원 비대면 수업 (배열 응용문제 풀이) - 조금 더 멋지게, 세련되게 로직을 세우고 싶다. 선생님뿐만아니라 다른 사람이 만든 코드도 많이 보고 내가 생각하지 못한 부분들을 쭉쭉 빨아들여야지.
    3. 블로그 포스팅 (java day11 정리, Javascript Day2) - 로또 추첨기에서 이중배열의 column끼리 중복을 제거하는 부분이 아직 말끔히 이해가 되지 않는다. 곰곰히 생각해봐야 할 문제이다.
    4. Javascript30 Tutorial Day 25 - 이벤트 버블링, 캡쳐링에 대해 배웠다. 버블링은 순차적으로 내려가는 것이고 캡쳐링은 그 반대, 또 그것을 해제하기 위한 stopPropagation 메소드. 자바스크립트 기본기 다진 다음에 꼭 사용해줄게~~~

  • 내일 할 것
    1. 이것이 리눅스다 Chapter 10 메일 서버 설치와 운영 (중간까지)
    2. Javascript30 Tutorial Day 26
    3. 학원 수업(15:30~22:00) 상속
    4. 블로그 포스팅 (Java Day 12, Javascript Day 3)

  • 끝으로

프로그램이 실행된다고 다는 아니구나.. 작동은 잘 되지만 뭔가 나의 코드는 세련되지 못하다고 해야할까

멋지지않아.. .😱😱

오늘의 한 줄 총평 : 코드에서 간지를 느낀 하루


JS Day 2 삼항,논리,! 연산자

|

JS Day 2 삼항, 논리, ! 연산자


  1. 삼항연산자의 연결

    let age = prompt("나이 입력");
    let msg =
      age < 20 ? "청소년" : age < 30 ? "청년" : age < 65 ? "성인" : "경로우대";
    
  2. 논리연산자

    • || OR 연산자
    • true가 없으면 마지막 값을 반환
    alert(undefined || null || 0 || "" || "안녕?"); //output : '안녕?' 출력
    alert(undefined || null || 0 || "" || false); //output : false 출력
    
    • Short-Circuit : true가 나오면 뒤에 연산 안하고 넘어간다 (성능 향상에 유용)
    alert(true || "안녕?"); //output : 'true' 출력
    alert(false || "안녕?"); //output : '안녕?' 출력
    
    • 첫번째 true 값을 반환
    function andEx(number) {
        const a = number || 3;
        console.log(a);
    }
    andEx(1); //1 출력, 매개변수 1이 true이므로 a에 number 대입
    andEx(0); //3 출력, falsy한 값을 매개로 주면 number는 false가 되어 안녕이 출력된다
    andEx(); //3 출력, number는 undefined가 되어 false가 되고 안녕이 출력된다
    
    function andEx(number = 3){...} //ES6부터 매개에 디폴트 깂을 할당하면 같은 효과!!★
    
    • && AND 연산자

    • 모두 true인 경우 마지막 값 반환

    alert(3 && 4 && 5); //5 출력
    
    • 첫번째 false 값을 반환
    alert(3 && 4 && 0); //0 출력
    alert(0 && 4 && ""); //0 출력
    
    • 우선순위 && > ||
    alert((1 && 0) || ("" && 4)); //'' 출력, (1 && 0)과 ('' && 4) 실행 후 (0 || '') 실행
    
  3. ! not 연산자

    • !! 두개 붙여서 쓰면 boolean() 과 같은 기능
    alert(!!3); //true 출력
    alert(!!0); //false 출력
    

참고 자료


JAVASCRIPT.INFO

Java Day 11 배열 응용문제 풀이

|

Java Day 11 배열 응용문제 풀이


  1. 중복 제거 원리

    로또 추첨기를 만들기에 앞서, 난수을 뽑았을 때 중복된 숫자 없이 원하는 개수만큼 숫자를 뽑는 원리에 대해 아라보자~

    • 핵심은 이중for문을 활용할 것 !
    • 첫번째 for문을 고정시키고 두번째 for문을 돌려 숫자를 비교
    • 중복된 숫자가 나오면 첫번째 for문의 count를 깎아 전 단계로 되돌림 (재추첨)
    int[] ex = new int[3]; //예시
    for(int i=0; i<ex.length; i++){
        ex[i] = (int)(Math.random()*4)+1; //1~4 무작위 난수로 배열을 채움
        for(int j=0; j<i; j++){ //비교를 위해선 최소 2개의 숫자가 필요, i=0, j=0일 경우는 skip된다
        	if(ex[i]==ex[j]){
                i--;  //i를 줄여 다시 난수를 뽑는다
                break;  //불필요한 연산을 줄여준다, 하나라도 같으면 뒤에 다 비교할 필요가 없기때문
            }
        }
    } //output : 중복값 없이 1,2,3,4 중 3개의 숫자가 정상 출력된다
    


  2. 버블 정렬

    버블정렬

    • 숫자가 4개일때 총 3회차까지 진행

    • 1회차 = 배열의 첫번째값과 두번째값 비교 -> 첫번째가 크면 두 값을 바꿈

      두번째,세번째 비교 / 세번째,네번째 비교 (총 3번 비교)

    • 2회차 = 동일하게 총 2번 비교, 3회차 = 1번 비교


    int[] bubble = new int[4];
    
    //배열 bubble에 4개의 무작위 숫자 입력
    for(int i=0; i<bubble.length; i++){
        bubble[i] = System.in.read() - 48;
    }
    System.in.read(); System.in.read();
    
    //버블정렬 알고리즘
    for(int i=0; i<bubble.length-1; i++){ //총 3회차까지 진행
    	for(int j=0; j<bubble.length-1-i; j++){ //i값을 빼줘서 i가 증가할수록 비교횟수 감소
            if(bubble[j]>bubble[j+1]){ //인접한 두 수를 순차적으로 비교
                int temp = bubble[j]; //배열의 값을 바꿔치기위해 임시저장소 생성
                bubble[j] = bubble[j+1];
                bubble[j+1] = temp;
            }
        }
    }
    


  3. 선택 정렬

    선택정렬

    • 버블정렬 보다는 쉽다
    • 이중 for문으로 순차적으로 비교
    • i와 j 인덱스의 배열값을 비교하여 true면 바꿔치기


    int[] selection = new int[4];
    
    //배열 selection에 4개의 무작위 숫자 입력
    for(int i=0; i<selection.length; i++){
        selection[i] = System.in.read() - 48;
    }
    System.in.read(); System.in.read();
    
    //선택정렬 알고리즘
    for(int i=0; i<selection.length-1; i++){ //총 3회차까지 진행
    	for(int j=i+1; j<selection.length; j++){ //i값을 더해서 i가 증가할수록 비교횟수 감소
            if(selection[i]>selection[j]){ //i고정시키고 j 돌려서 전부 비교
                int temp = selection[i]; //배열의 값을 바꿔치기위해 임시저장소 생성
                selection[i] = selection[j];
                selection[j] = temp;
            }
        }
    }
    


  4. 로또 추첨기

    대망의 로또추첨기이다. 난수만 6개 뽑으면 될거같은데 생각보다 간단하지가 않다.

    주어진 조건 : 입력한 숫자만큼 로또 추첨, 중복 당연히 안됨, 회차별로 6개의 숫자가 모두 같으면 안됨, 추첨된 숫자는 정렬해서 보여준다

    • 몇 게임 실행할건지 입력 받음
    • 이중배열 생성
    • 난수 생성 로직 구현
    • 중복 제거
    • 이중배열의 행별로 중복 제거(6개 숫자가 모두 같은지)
    • 정렬
    • 출력
    import java.io.*;
    
    public class lotto{
        public static void main(String[] args)throws IOException{
            //숫자 입력받기
            BufferedReader br =
                new BufferedReader(new InputStreamReader(System.in));
            System.out.println("몇 게임 하실?");
            int number = Integer.parseInt(br.readLine());
            //로또 담을 배열 생성
            int[][] lotto = new int[number][6];
            for(int i=0; i<number; i++){
                for(int j=0; j<lotto[i].length; j++){
                    lotto[i][j] = (int)(Math.random()*45)+1; //1~45 무작위 6개 뽑기
                    	for(int k=0; k<j; k++){ //중복 제거
                            if(lotto[i][j] == lotto[i][k]){
                                j--;
                                break;
                            }
                        }//end if
                }//end for j
                int count = 0; //중복 검사를 위한 변수
                for(int z=0; z<i; z++){
                    count = 0;
                    for(int j=0; j<lotto[i].length; j++){
                        for(int k=0; k<lotto[z].length; k++){
                            if(lotto[i][j] == lotto[z][k]){
                                count++;
                                break;
                            }
                        }//end for k
                        if(j == count){
                                break;
                        }
                    }//end for j
                    if(count == 6){ //모두 같으면 해당 행 재추첨
                            i--;
                            break;
                    }
                }//end for z
            }//end for i
            for(int i=0; i<number; i++){
                System.out.print((i+1)+" 번째 추첨번호 : ");
                for(int j=0; j<lotto[i].length; j++){
                    System.out.print(lotto[i][j]+" ");
                }
                System.out.println();
            }
        }//end main
    }
    

참고 자료


KG아이티뱅크 자바 강의자료