반응형

추상클래스란?

1. 추상 메소드와 완성된 메소드로 구성되어 있는 클래스.
 
2. 추상 메소드(Abstract Method)선언부만 존재하며, 구현부 {}는 존재하지 않는다.
 
3. 만약 main 함수에서 추상 클래스 자료형의 객체를 생성하려면, 상속 클래스를 통해 추상 메소드를 구현(구현부를 작성)을 해야 한다.
 
4. 추상 클래스를 상속받은 클래스는 추상 클래스에 있는 추상 메소드를 구현해줘야한다. 단, 상속 받은 클래스가 추상 클래스일 경우에는 모든 추상 메소드를 구현하지 않아도 된다.

우선 첫 번쨰와 두 번째 정의를 살펴보자.

 

1. 추상 메소드와 완성된 메소드로 구성되어 있는 클래스.

2. 추상 메소드(Abstract Method)는 선언부만 존재하며구현부 {}는 존재하지 않는다.

초록색 네모 안에는 class 앞에 abstract를 사용하여 추상 클래스임을 확인할 수 있다.

빨간색 네모 안에 있는 abstract void move(int x, int y);는 여타 메소드와는 다르게 구현부 {}, 중괄호로 되어 있는 부분이 없다. 이런 메소드를 추상 메소드라고 불리며, 껍데기만 있다고 표현할 수 있다.

검은 네모 안에 있는 메소드는 흔히 볼 수 있는 메소드이다. 선언부에 void stop()이 있고, 구현부에는 값을 출력하는 것을 보이고 있다.

이처럼 추상 클래스는 클래스 내에 추상 메소드, 일반 메소드가 모두 존재할 수 있다. 하지만, 인터페이스는 무조건 추상 메소드만 있어야 한다는 것이 추상 클래스와의 차이점이다.

 

3. 만약 main 함수에서 추상 클래스 자료형의 객체를 생성하려면상속 클래스를 통해 추상 메소드를 구현(구현부를 작성)을 해야 한다.

abstract class Unit {       // 추상 클래스에는 일반 메서드도 포함. 인터페이스는 무조건 추상메서드
    int x, y;
    abstract void move(int x, int y);
    void stop() {/* 현재 위치에 정지 */}
}

class Marine extends Unit {
    void move(int x, int y){
        System.out.println("Marine[ x = " + x + ", y = " + y + "]");
    }
}

class Tank extends Unit {
    void move(int x, int y){
        System.out.println("Tank[ x = " + x + ", y = " + y + "]");
    }
}   

class Dropship extends Unit {
    void move(int x, int y) {
        System.out.println("Dropship[ x = " + x + ", y = " + y + "]");
    }
}

public class Abstract3 {
    public static void main(String args[]){
//      Unit[] group = {new Marine(), new Dropship(), new Tank()}; 아래 세 줄을 한 줄로 줄인 것   // 추상 클래스 객체를 만드는 건 불가능. 왜냐면 추상 클래스에는 추상 메서드가 있을 수 있기 때문. 그래서 상속받은 클래스 형으로 객체를 생성해야 함.
        Unit[] group = new Unit[3];
        group[0] = new Marine();
        group[1] = new Dropship();
        group[2] = new Tank();
    
        group[0].move(100, 200);
        group[1].move(100, 200);
        group[2].move(100, 200);

    }
}

 

우측이 추상 클래스, 좌측이 추상 클래스를 상속받은 Marine, Tank, Dropship 클래스

Unit 이라는 추상 클래스를 상속 받은 Marine, Tank, Dropship 클래스들은 추상 메서드인 abstract void move(int x, int y);를 구현(완성)하고 있는 것을 확인할 수 있다. 만약 Unit 추상 클래스를 상속받은 일반 클래스에서, move 메서드를 구현하지 않았다면 컴파일러에서 에러를 발견하여 빨간 줄이 뜨는 걸 볼 수 있다. 이렇게 추상 매서드를 구현해야 main에서 Unit 객체를 생성할 수 있다.

 

이렇듯, 여러 클래스에 공통적으로 사용될 수 있는 추상 클래스를 바로 작성하거나 기존 클래스의 공통 부분을 뽑아서 추상 클래스를 만들 수 있다.

 

(참고, Marine, Tank, Dropship 객체를 생성하되 참조변수는 Unit 으로 선언할 수 있다. 왜냐하면 상속 받았기 때문!

 

ex) Unit[] group = new Unit[3]; 

Unit[] group = new Marine[3];

Unit[] group = new Tank[3];

Unit[] group = new Dropship[3] ;

 

하지만 Marine 객체를 선언하면 Marine 클래스 내에 있는 메소드와 상속 받은 Unit 클래스 내에 있는 메소드만 사용 가능하다. 나머지도 동일!)

 

4. 추상 클래스를 상속받은 클래스는 추상 클래스에 있는 추상 메소드를 구현해줘야한다. 단, 상속 받은 클래스가 추상 클래스일 경우에는 모든 추상 메소드를 구현하지 않아도 된다.

 

이게 무슨 뜻인지 아래 코드를 보며 이해해보자.

 

좌측이 추상 클래스, 우측이 Marine 클래스

추상 클래스 Unit에는 세 가지의 메서드가 있다.

abstact void move, abstract void fly, void stop.

 

<만약 main 함수에서 추상 클래스 자료형의 객체를 생성하려면상속 클래스를 통해 추상 메소드를 구현(구현부를 작성)을 해야 한다>라는 3번의 정의에 따르면,  현재 Marine 클래스에는 move 메서드는 구현했지만 fly 메서드는 구현하지 않았다. 그래서 빨간 줄이 나오는 것을 볼 수 있다. 

 

하지만, 여기서 Marine 클래스를 추상 클래스로 선언한다면, 굳이 모든 추상 메서드를 구현할 필요가 없어진다.

반응형
반응형

프로그래머스에서 문제를 풀다가 오름차순으로 정렬할 알고리즘이 있었다.

2중 for문에 익숙한 나는, 2중 for문으로만 하려고 했는데 알고리즘을 공부하기 위해선 다양한 방법을 시도해야 했다.

그래서 Arrays.sort() 메쏘드를 사용했다.

 

 


1. 2중 for문을 사용한 오름차순 정렬
import java.util.*;

public class HelloJava {
    public static void main(String args[]) {
        
        int[] a = new int[]{1,5,4,3,2};
        int k;

        for(int i = 0; i < a.length - 1; i++){
            for(int j = i + 1; j < a.length; j++){
                if(a[i] > a[j]){
                    k = a[i];
                    a[i] = a[j];
                    a[j] = k;       
                }
            }
        }
        System.out.println(Arrays.toString(a));
    }
}

 

 

2. Arrays.sort()를 사용하여 오름차순 정렬
import java.util.*;

public class HelloJava {
    public static void main(String args[]) {
        
        int[] a = new int[]{1,5,4,3,2};
        
       	Arrays.sort(a);
        
        System.out.println(Arrays.toString(a));
    }
}

여기서 만약에

System.out.println(a);

로 값을 출력한다면 [I@24d46ca6 와 같은 배열 a의 주소값이 나올 것이다.

배열은 참조변수이므로, 배열의 원소값을 나타내기 위해서는 toString 메소드를 사용한다면 파라미터를 통해 원소 값을 문자열로 변환 후, 원소를 출력할 수 있다.

반응형
반응형

 

적용 알고리즘 : 1~6 사이의 수 중에서 나올 수를 예측하고, 실제로 나온 수와 비교하는 것이다.

 

간단하게 해결!!

 

 

//주사위 값 예측하기

import java.util.*;

class DiceGame {    // DiceGame 클래스를 생성
    
    int diceFace;
    int userGuess;

    private void RollDice() {
        diceFace = (int)(Math.random() * 6) + 1;
    }

    private int getUserInput(String prompt) {
        System.out.println(prompt);
        Scanner s = new Scanner(System.in);
        return s.nextInt();
    }

    private void checkUserGuess() {
        if (diceFace == userGuess){
            
            System.out.println("주사위 값은 " + diceFace + "이고,");
            System.out.println("내가 예측한 값은 " + userGuess + "이다.");
            System.out.println("예측 값이 맞았다!!");
        }
        else{
            System.out.println("주사위 값은 " + diceFace + "이고,");
            System.out.println("내가 예측한 값은 " + userGuess + "이다.");
            System.out.println("예측 값이 틀렸다!!");
        }
    }

    public void startPlaying() {
        userGuess = getUserInput("예상값을 입력하시오.");       //getUserInput
        RollDice();     //RollDice 메써드 실행
        checkUserGuess();       //checkUserGuess 메써드 실행
    }
}

public class DiceGameTest {
    public static void main(String[] args) {
        DiceGame game = new DiceGame();     //DiceGame 객체 생성
        game.startPlaying();
    }
}
반응형
반응형

# for문

for문은 C, Java, javascript 등등 절차지향, 객체지향, 스크립트 언어 모든 곳에서 자주 쓰인다. 오늘은 html, css, javascript를 이용해서 간단하게 구구단을 화면에 출력해보자.

 

<HTML, javascript>

<!DOCTYPE html>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>구구단 - for문</title>
	<link rel="stylesheet" href="css/gugudan-table.css">  <!-- 아래 css파일이 위치한 경로를 지정-->
<body>
	<h1>구구단</h1>
	<script>
		var i, j;

		for (i = 1; i <= 9; i++) {
			document.write("<table>");
			document.write("<tr><th>" + i + "단</th></tr>");
			for (j = 1; j <= 9; j++) {
				document.write("<tr><td>" + i +" X " + j + " = " + i*j + "</td></tr>");
			}
			document.write("</table>");
		}
	</script>
</body>
</html>

구구단 알고리즘은 이중for문을 사용하여 간단하게 구현할 수 있다. 그리고 나머지는, 입맛에 맞게 꾸미면 된다!

 

<CSS>

div{
    display: inline-block;
    padding: 0 20px 30px 20px;
    margin: 15px;
    border: 1px solid #ccc;
    line-height: 2;
}

div h3 {
    text-align: center;
    font-weight: bold;
}

 

위 코드는, Do it html/css, javascript의 책을 인용했습니다!

반응형
반응형

Javascript뿐만 아니라, if와 switch 제어문은 다른 언어를 공부할 때도 항상 배우는 요소이다. 각 제어문은 기능은 비슷하나, 장단점을 지니고 있다. switch는 case를 나눠서 하기 때문에 '정확하고, case가 적은 경우'에 효율적이다. if문은 '좀 더 큰 범위의 case(?)'에 장점을 지닌다. 

 

운영체제 측면에서 if와 switch를 비교하면, switch문을 사용했을 때 cpu가 명령을 수행하기 위해 메모리에 접근하는 횟수가 현저히 적다. 왜냐하면, if문을 사용했을 때는 if문을 만날 때마다 cpu가 메모리에 접근하지만, switch는 한번만 접근하면 여러 case에 값을 비교할 수 있기 때문이다.


#switch문

 

switch문은 하나 이상의 case와 break, default로 이루어져있다. 코드 예시를 보면 쉽게 이해가 될 것이다.

 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Javascript 배우기</title>
    </head>
    <body>
        <h1>Javascript</h1>
        <script>
            var session = prompt("숫자를 선택하세요");

            switch(session) {
                case "1" : 
                document.write("숫자 1을 입력했습니다.");
                alert("1");
                break;

                case "2" : 
                document.write("숫자 2를 입력했습니다.")
                alert("2");
                break;

                case 3 : 
                document.write("숫자 3을 입력했습니다.")
                alert(3);
                break;

                default : alert("숫자를 잘못 입력하셨습니다.");
            }

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

중요한 것은 switch문의 case에는 항상 break가 있어야 한다는 것..!


# if문

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

    <title>Document</title>
</head>
<body>
    <h1>Javascript 연습하기</h1>
    <script>
        var memNum = prompt("입장하는 관객의 수를 입력하세요.");
        var colNum = prompt("한 줄에 몇 명씩 앉을지 입력하세요.");
        var rowNum;

        if(memNum % colNum === 0){
            rowNum = memNum / colNum;
            document.write("총 " + colNum + "명씩 "+ rowNum + "줄로 앉으면 됩니다.");
        }

        else{
            rowNum = (memNum % colNum) + 1;
            document.write("총 " + colNum + "명씩 "+ rowNum + "줄로 앉으면 됩니다.");
        }
    </script>
</body>
</html>

 


# prompt와 parseInt, parsedouble 등등..

 

프롬프트(prompt)란 사용자에게 창을 띄워서 데이터를 받아올 수 있는 함수이다. 

위 switch문 예제를 실행하면 이렇게 나올텐데, 이것이 바로 prompt이다. alert과 비슷하게 생겼지만, alert은 사용자에게 말 그대로 값을 보여주는 주의와 같은 개념이기에 데이터를 받아오지는 못한다.

prompt는 데이터를 받으면 자동으로 문자열로 변환한다.

 

그렇기 때문에, parseInt()로 감싸주면, 프롬프트창으로 받은 데이터가 정수형으로 저장된다.

마찬가지로, parsedouble(), parsefloat()으로 감싸주면 실수형으로 데이터가 저장된다.

 

위의 switch예제에서 숫자 3을 입력한다면, 어떤 뜻인지 이해가 빠를 것이다.

반응형

'프로그래밍 > HTML_CSS_Javascript' 카테고리의 다른 글

[HTML/CSS?Javascript] 구구단 출력하기  (0) 2023.04.04
반응형

 

한동안 깃허브와 vscode를 안 쓰다가, 오랜만에 커밋/푸쉬하려니 아래와 같은 오류가 떴다. 

 

Make sure you configure your 'user.name' and 'user.email' in git.

​기존에 연동돼있던 깃허브와 vscode에서 뭔가 문제가 생긴 듯 하다. 오류 문구를 보고 직감적으로 든 생각은, 내가 깃허브의 닉네임을 바꿨던 것 때문에 발생한 것이라고 추궁했다. 근데 예전에 쓰던 닉넴이 기억이 안난다!

이럴 때는 어떻게 해결 하느냐? 아주 간단하다~

 

 

1. vscode에서 terminal로 접속.

 

 

2. 자신의 Github name과 이메일을 config하는 명력어 입력

git config --global user.name "깃허브 닉네임"

git config --global user.email "깃허브 이메일"

ex)

git config --global user.name "hello"

git config --global user.name "abcde@naver.com"

 

큰 따옴표 안에 값을 입력해야 한다는 것 참고!!

반응형
반응형

 

Doing the right thing, even when no one is wathcing
아무도 보고 있지 않아도, 옳은 일을 하는 것

 

현재 보안회사에서 일을 하는 나에게 아주 적절한 말인 듯 하다.

 

사실 정보보안 직무를 맡기 전에도, 나는 비슷한 가치관을 가지고 있었다.  누군가 알아주지 않아도 내 스스로가 알아주니까 열심히 해보자! 라는 생각이 강했었다.

 

그런데 어느 순간 부터... 내 신념이 흔들리기 시작했었는데, 그건 대학교 3~4학년 때 였던 것 같다. SNS를 급격하게 하기 시작하며, 흔히 말하는 '보여주기식 삶'을 살았다. 2년간 그랬던 행동들은 이제 접어두고, 다시 내 일에 집중할 때가 온 듯 하다!

 

성공하즈아~

 

 

반응형
반응형

전자공학을 전공하고 정보보안팀에서 인턴을 하고 있는 나는, 머릿속이 혼란스러울 때가 많다. 네트워크에 대해서도 어느 정도 배웠지만, 실무에서 쓰는 내용은 이론과 차이가 있었다. 학교에서 공부할 때는 정말 자세한 부분만 배웠던 파트도 있고, 수박 겉핥기로 배웠던 부분도 있는데, 실무에 오니 모든 것들을 종합한 지식이 내 머릿속에 있어야 한다...!

 

그중에서도 가끔씩 헷갈리는 용어들이 있다. 

 

SoC란?

전자공학이나 반도체 공부를 조금 했던 사람은, 당연히 System on Chip 아니야?라고 생각했을 것이다. 여러 기능을 가진 수많은 소자(메모리 소자, CPU 등)들이 모여 하나의 칩을 완성하는 것.

 

그런데, 인턴을 하면서 SoC란 단어가 조금 어색하게 쓰이는 것을 발견했다. 왜 그것을 SoC라고 부를까? 싶었는데, 알고 보니... SoC의 뜻이 System on Chip이 아니었다.

 

반도체에서 SoC : System on Chip

보안에서 SoC : Security Operation Center

 

하하...머쓱하다!

 

아직 갈 길이 멀구나~~

반응형
반응형

크롬을 사용하다 보면 마우스로 탭을 클릭하는 경우가 많은데, 이때 좀 더 효율적으로 사용하기 위해서 우리는 단축키를 사용한다. 내가 크롬에서 쓰는 몇 가지 단축키만 쪼금 모아봤다..!!

 

 

  • 현재 탭 닫기 : Ctrl + w
  • 크롬 전체 탭 닫기 : Ctrl + Shift + w (이거 그대로 하면, 지금 보는 창이 닫아집니다.. 주의하세요!)
  • 다음 탭으로 이동 : Ctrl + tab
  • 이전 탭으로 이동 : Ctrl + shift + tab
  • 새 탭 만들기 : Ctrl + T
  • 검색 주소창으로 이동하기 : F6
  • 페이지 검색 : Ctrl + F
  • 작업관리자 열기 : Ctrl + Shift + ESC

 

 

 

반응형
반응형

2023 CES를 참관하기 전, 우연히 한 회사의 인턴 공고를 봤다. 그래서 경험삼아? 써봤다. 내가 왜 '경험삼아'라는 표현을 적었냐면, 내가 원하는 직무는 아니었고, 군대에서 내가 맡았던 일에 대한 직무여서 그렇다.

근데 이게 왠 걸? 자소서에 군대 이야기 밖에 없는데 합격 소식을 들은 나...

물론 1차, 2차 면접을 통과해야지 인턴이 되는 것. 면접 경험을 쌓기 위해서, 나는 귀국하자마자 판교로 달려갔다.

 

 

??? 와 정장이 잘 어울리시네요?

나 : 네, 대여했거든요 ㅋㅋ

 

급하게 준비한다고 정장도 없이 올라왔던.. 그래도 이 면접 날 이후로, 아빠가 정장 한 벌 사줬다. 나는야 불효자st...

 

면접은 30분간 다대다 형식으로 진행됐다. 면접관 3분, 면접자 4명이었다. 우선 면접자 4명이서 모이는 공간에서, 나는 긴장을 풀겸 다른 사람들에게 말을 걸었다. 사실 이게 맞는 행동인지..는 의문이 들어서, 일단 먼저 말 걸어보고 별로 대답하고 싶지 않은 내색을 보인다면 그만하려고 했다. 다행히도, 다들 자연스럽게 대화를 이어갔고, 그렇게 면접장에 들어서게 됐다.

 

면접은 생각보다 네거티브 했다. 무슨 말이냐면, 내 자소서 조차 안 읽었다고 느껴진 경험이다.

 

이게 면접이구나...! 하며 속으로 무릎을 탁! 쳤다.

 

그렇게 어영부영 면접을 끝내고, 같이 면접 봤던 분들의 번호를 받으며 2차 면접에서도 다같이 보자고 기약했다.

 

기대는 안하고 있지만, 그래도 합격 소식이 들려오기를!

 

반응형

+ Recent posts