반응형


1. 에러 상황

Nuxt.js App 기동 중 다음 에러 발생했습니다.

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:71:19)
    at Object.createHash (node:crypto:133:10)
    at module.exports (/Users/parkjinseong/learn-nuxt/node_modules/webpack/lib/util/createHash.js:135:53)
    at NormalModule._initBuildHash (/Users/parkjinseong/learn-nuxt/node_modules/webpack/lib/NormalModule.js:417:16)
    at handleParseError (/Users/parkjinseong/learn-nuxt/node_modules/webpack/lib/NormalModule.js:471:10)
    at /Users/parkjinseong/learn-nuxt/node_modules/webpack/lib/NormalModule.js:503:5
    at /Users/parkjinseong/learn-nuxt/node_modules/webpack/lib/NormalModule.js:358:12
    at /Users/parkjinseong/learn-nuxt/node_modules/webpack/node_modules/loader-runner/lib/LoaderRunner.js:373:3
    at iterateNormalLoaders (/Users/parkjinseong/learn-nuxt/node_modules/webpack/node_modules/loader-runner/lib/LoaderRunner.js:214:10)
    at Array.<anonymous> (/Users/parkjinseong/learn-nuxt/node_modules/webpack/node_modules/loader-runner/lib/LoaderRunner.js:205:4) {
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

2. 에러 원인

Nuxt.js App 에서 지원하는 Node.js 버전과 상이한 버전 사용 중으로 에러 발생했습니다.


3. 에러 해결책

Node.js 버전 변경으로 해결했습니다.

Node.js 버전을 변경하는 방법은 여러가지가 있습니다.

굳이 기설치된 버전을 삭제하고, 다시 설치할 필요없이 Node.js 버전 관리 App인 NVM 설치 후 버전을 변경하고 에러를 해결했습니다.

 

 

 

행복한 하루 보내세요.

감사합니다.

반응형
반응형

자바스크립트 호기심천국

이번에 다뤄볼 주제는 일반적인 함수 정의 방식 vs 익명 함수 선언 참조 방식 입니다!

참 길고 복잡해보입니다.

하지만 알고보면 별거 아닌 이야기라는 것~ 하지만 그게 디테일이라는 것~

한 번 알아보겠습니다.

 


1. 기본 함수 정의문

함수를 사용하여 코드를 저장하는 것을 함수 정의문이라고 합니다.

변수를 선언할 때 var, let, const 를 사용한 것처럼 함수에서는 function 키워드를 사용해 함수를 선언합니다.

 

이 떄 함수 정의문은 다음 두 방식으로 선언할 수 있습니다.

 

1) 일반적인 함수 정의

함수를 다음과 같이 선언합니다.

function myFunction() {
  count++;
  document.write("hello" + count, "<br>");
}

 

함수를 다음과 같이 사용합니다. 참 쉽죠?

myFunction();

 

2) 익명 함수 선언 참조 방식

함수를 다음과 같이 선언합니다.

var theFunction = function () {
  count++;
  document.write("bye" + count, "<br>");
};

 

함수를 다음과 같이 사용합니다. 참 쉽죠?

theFunction();

 


2. 두 방식 간 차이

함수 선언 방식 두 가지를 살펴보았습니다.

두 방식 간 차이가 과연 있긴 한건가 의심이 됩니다.

바로 알아보겠습니다.

 

일반 함수 정의는 함수 호출 시 호이스팅(Hoisting) 기술을 지원합니다.

그러나 익명 함수 선언 참조 방식은 호이스팅을 지원하지 않습니다.

 

호이스팅 기술을 적용하면 함수 정의문보다 함수 호출문이 먼저 나와도 정상 동작합니다.

자바스크립트에서 호이스팅이란, 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미합니다.

쉽게 설명하여 선언과 초기화를 분리한 후, 선언만 코드의 최상단으로 옮기는 것이라고 생각하시면 됩니다.

 

쉽게 코드로 확인해보겠습니다.

다음은 일반적인 함수 정의 방식입니다.

var count = 0;

myFunction();

function myFunction() {
  count++;
  document.write("hello" + count, "<br>");
}

소스코드를 순서대로 읽어내려가는 인터프리터 언어 특성 상 myFunction(); 호출문은 아직 선언된 상태가 아니므로,

상상 속에서는 동작이 실패했어야 하지만, 정상동작함을 확인할 수 있습니다.

이는 호이스팅 기능 덕으로 함수의 선언부가 코드의 최상단으로 옮겨진 후 동작을 했기 때문입니다.

 

다음은 익명 함수 선언 참조 방식입니다.

var count = 0;

theFunction();

var theFunction = function () {
  count++;
  document.write("bye" + count, "<br>");
};

위 코드는 실행 시

Uncaught TypeError 가 발생합니다.

이유는 전과는 정반대로 호이스팅 기술을 지원하지 않기 때문입니다.

 

두 방식 간 차이점을 확인해봤습니다.

그럼 결론으로 넘어가보겠습니다.


3. 결론

결론입니다.

호이스팅 방식을 보면 코드의 자유도가 하나의 장점인 자바스크립트의 매력 포인트로 보입니다.

하지만 자유도 과하면 독이 되는 법입니다.

길고 긴 코드, 여러 사람이 관리하는 코드일 경우 선언되지 않은 함수나 변수가 사용되는 것은 관리하기에는 단점이 될 수 있습니다.

 

비슷한 느낌으로 변수의 선언방식 var, let, const 중 var 가 이미 권장하지 않는 선언방식이 되었습니다.

이유는 여러가지가 있겠지만, 이번 사례와 같이 호이스팅 기술의 지원 유무가 큰 몫을 했습니다.

 

코딩에 정답은 없지만, 더 나은 방식은 존재합니다.

길고 길었지만 결론: 보통의 경우에는 익명 함수 선언 참조 방식을 사용하시면 됩니다!

var theFunction = function () {
  count++;
  document.write("bye" + count, "<br>");
};

 


부족한 글 읽느라 고생하셨습니다.

오늘도 좋은 하루 보내세요.

감사합니다.

반응형
반응형

 


디렉토리 구조

2022년 9월 기준 디렉토리 구조는 아래의 이미지와 같습니다.

20개라는 수가 부담스럽지만, 하나하나 확인해보겠습니다.


app.vue

app.vue 는 Nuxt3 앱의 메인 컴포넌트입니다.

라우팅 기능과 pages의 사용은 필수가 아니기 때문에 ,

순수하게 app.vue를 다음과 같이 사용할 수 있습니다.

<template>
  <h1>Hello World</h1>
</template>

 

 

만약 pages 디렉토리를 구성했다면, 다음과 같이 사용할 수 있습니다.

~/pages/index.vue

<template>
  <div>
    텍스트
  </div>
</template>

<script>
export default {
  name: "index"
}
</script>

<style scoped>

</style>
app.vue

<template>
  <div>
    <NuxtPage/>
  </div>
</template>

app.vue 가 메인 컴포넌트라는걸 명심해야 합니다.

app.vue 에 추가하는 스크립트나 CSS 는 전역적으로 적용됩니다.


layouts

Nuxt는 layouts 디렉토리를 이용해 앱 전체에서 사용할 수 있는 레이아웃을 커스터마이징 할 수 있게 지원합니다.

UI 와 코드 패턴을 재사용하는데 이상적입니다.

레이아웃은 layouts 디렉토리에 위치하며, 자동 import 되어 사용되어집니다.

 

레이아웃의 사용법은 app.vue 에 <NuxtLayout> 을 추가하는 것입니다.

 

레이아웃 명명에는 보통 케밥 케이스가 사용됩니다.

예를 들어, someLayout -> some-layout 이 됩니다.

 

만약 레이아웃이 하나밖에 없는 앱이라면 layouts 디렉토리를 사용하지 말고, app.vue 만을 사용하는 것을 권장합니다.

 

다음은 간단한 사용 예입니다.

<NuxtLayout> 은 default 로 ~/layouts/default.vue 를 import 합니다.

~/layouts/default.vue

<template>
  <div>
    Layout은 모든 페이지에서 공유됩니다.
    <br>
    <slot/>
  </div>
</template>

<script>
export default {
  name: "default"
}
</script>

<style scoped>

</style>
app.vue

<template>
  <div>
    <NuxtLayout>
      slot 을 임의의 문장으로 채워봅시다.
    </NuxtLayout>
  </div>
</template>

 

default 레이아웃이 아닌 레이아웃을 지정해서 사용해보겠습니다.

~/layouts/layout-one.vue

<template>
  <div>
    Layout-One 레이아웃입니다.
    <br>
    <slot/>
  </div>
</template>

<script>
export default {
  name: "layout-one"
}
</script>

<style scoped>

</style>
app.vue

<template>
  <div>
    <NuxtLayout :name="layoutName">
      slot 을 임의의 문장으로 채워봅시다.
    </NuxtLayout>
  </div>
</template>

<script setup>
const layoutName = "layout-one"
</script>

 

이제 응용하여 동적으로 레이아웃을 변경해보겠습니다.

 

 


.nuxt

개발 모드로 Nuxt3 앱을 실행할 때 해당 디렉토리에 Nuxt3 앱이 생성됩니다.

.output

운영 모드로 Nuxt3 앱을 실행할 때 해당 디렉토리에 Nuxt3 앱이 생성됩니다.

Asseets

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형


코드 입력 시 주의사항

 

1. JS 는 대소문자를 구분하여 작성합니다.

New date(); -----> X
new Date(); -----> O

 

2. 코드 한 줄을 작성한 후에는 세미콜론(;) 을 쓰는 것이 좋습니다.

document.write("hi") document.write("bye") -----> X
document.write("hi"); document.write("bye"); -----> O

 

3. 코드를 작성할 때는 한 줄에 한 문장만 작성하는 것이 가독성을 위해 좋습니다.

document.write("hi"); document.write("bye"); -----> X

document.write("hi"); 
document.write("bye"); -----> O

 

4. 문자형 데이터를 작성할 때는 큰따옴표(" ") 와 작은 따옴표(' ')의 겹침 오류를 주의해야 합니다.

document.write("티스토리에 "자바스크립트는 대소문자를 구분해야 합니다" 라고 나와 있습니다."); -----> X

document.write('티스토리에 "자바스크립트는 대소문자를 구분해야 합니다" 라고 나와 있습니다.'); -----> O
document.write("티스토리에 \"자바스크립트는 대소문자를 구분해야 합니다\" 라고 나와 있습니다."); -----> O

 

5. 코드를 작성할 때 중괄호{} 또는 소괄호()의 짝이 잘 맞아야 합니다.

document.write("welcome!"; -----> X
document.write("welcome!"); -----> O

 


변수 선언 시 주의사항

 

1. 변수명 첫 글자로는 $, _(언더바), 영문자만 올 수 있습니다.

var 1num = 10; -----> X 
var num1 = 10; -----> O
var $num = 10; -----> O
var _num = 10; -----> O

 

2. 변수명에는 영문자, 숫자, $, _(언더바)만 포함할 수 있습니다.

var num*1 = 10; -----> X
var num_$1 = 10; -----> O

 

3. 변수명으로는 예약어를 사용할 수 없습니다.

예약어란 이미 자바스크립트 내에서 사용 중인 단어를 말합니다.

var document = 10; -----> X
var location = 10; -----> X
var window = 10; -----> X
var num2 = 10; -----> O

 

4. 변수명을 지을 때는 되도록 의미를 부여해 작성하는 것이 좋습니다.

var num1 = "hello"; -----> X
var num2 = 10; -----> O

 

5. 변수명을 사용할 때는 대소문자를 구분해야 합니다.

var num2 = 10;
document.write(Num2); -----> X
document.write(num2); -----> O

 


비교 연산자(==, ===)의 차이

 

A == B A 와 B 는 같다. 값이 숫자이건, 문자이건
자료형은 비교하지 않고 표기된 값만 일치하면 true 아니면 false 반환
A != B A 와 B 는 다르다.
A === B A 와 B 는 같다. 값과 자료형 모두 비교하여
일치하면 true 아니면 false 반환
A !== B A 와 B 는 다르다.

표로만 정리해선 이해가 쉽지 않습니다.

다음 스크립트를 통해 설명하겠습니다.

<script>
    var a = 10;
    var b = "10";

    document.write(a == b, "<br>");
    document.write(a != b, "<br>");
    document.write(a === b, "<br>");
    document.write(a !== b, "<br>");
</script>

 

결과값은 다음과 같습니다.

true
false
false
true
반응형
반응형

 

반응형

'JAVA > 기본 개념' 카테고리의 다른 글

#10 열거형(Enum)  (0) 2022.08.31
#5 추상 클래스 (Abstract Class)  (0) 2022.08.24
#8 Object 클래스  (0) 2022.08.23
#4 예외처리(Exception Handling)  (0) 2022.08.22
#3 인터페이스  (0) 2022.08.22
반응형

열거형의 목적

열거형은 자바 5에서 추가된 자료형으로, 의미가 부여된 이름을 갖는 상수의 선언에 그 목적이 있습니다.

 

열거형 학습에 앞서, 자바 5 이전에는 의미가 부여된 이름을 갖는 상수를 어떻게 선언했는지 다음 코드로 확인해보겠습니다.

public interface Scale {
    int DO = 0;
    int RE = 1;
    int MI = 2;
    int FA = 3;
    int SO = 4;
    int RA = 5;
    int TI = 6;
}

public class InterfaceBaseConst {
    public static void main(String[] args) {
        int sc = Scale.DO;

        switch (sc) {
            case Scale.DO:
                System.out.println("음 이름 : 도");
                break;
            case Scale.RE:
                System.out.println("음 이름 : 레");
                break;
            case Scale.MI:
                System.out.println("음 이름 : 미");
                break;
            case Scale.FA:
                System.out.println("음 이름 : 파");
                break;
            default:
                System.out.println("음 이름 : 솔, 라, 시");
        }
    }
}

출력 결과값은 다음과 같습니다.

음 이름 : 도

인터페이스 내에 선언된 변수는 public, static, final 이 선언된 것으로 간주합니다.

따라서 인터페이스 Scale 을 통해 7개의 상수가 선언되었습니다.

 

인터페이스 Scale 은 음계를 표현한 상수들을 담고 있습니다.

이 경우 중요한 것은 상수의 값이 아니라 상수의 이름입니다.

즉 상수의 값이 바뀌어도 이름이 바뀌지 않는다면 코드에 아무런 영향을 주지 않습니다.

그리고 이렇게 연관된 상수들을 하나의 인터페이스로 묶어서 선언하는 것이 자바 5 이전에 사용하던 방법입니다.

그러나 이 방법에는 문제가 하나 있는데, 그 문제점을 다음 코드에서 확인하겠습니다.

public interface Animal {
    int Dog = 1;
    int CAT = 2;
}

public interface Person {
    int MAN = 1;
    int WOMAN = 2;
}

public class NonSafeConst {
    public static void main(String[] args) {
        who(Person.MAN);
        who(Animal.Dog);
    }

    public static void who(int man) {
        switch (man) {
            case Person.MAN:
                System.out.println("남자입니다.");
                break;

            case Person.WOMAN:
                System.out.println("여자입니다.");
                break;
        }
    }
}

출력 결과값은 다음과 같습니다.

남자입니다.
남자입니다.

Person.MAN 도 값이 1이고 Animal.DOG 도 값이 1이기 때문에,

위와 같은 실수를 범해도 컴파일 오류는 물론 실행 오류도 발생하지 않습니다.

그 문제점을 해결하기 위해 자바 5에서 열거형이 소개되었습니다.


열거형의 정의

열거형은 다음과 같이 정의합니다.

그 안에 위치한 이름들을 가리켜 '열거형 값' 이라고 합니다.

public enum Scale {
    DO, RE, MI, FA, SOL, RA, THI
}

 

열거형은 클래스와 성격이 유사합니다.

따라서 다음과 같이 참조변수의 선언도 가능합니다.

단 이렇게 선언된 참조변수는 해당 열거형 내에 선언된 '열거형 값'만 대입이 가능합니다.

        Scale scale = Scale.DO;

 

기본적으로 열거형 값은 Scale.DO 와 같이 표현하지만,

case 문에서는 표현의 간결함을 위해 Do 와 같이 열거형 값의 이름만 명시하기로 약속되어 있습니다.

다음은 열거형 이전의 코드를 열거형 이후의 코드로 수정한 코드입니다.

public enum Scale {
    DO, RE, MI, FA, SOL, RA, THI
}

public class SimpleEnum {
    public static void main(String[] args) {
        Scale scale = Scale.DO;
        System.out.println(scale);

        switch (scale) {
            case DO:
                System.out.println("음 이름 : 도");
                break;
            case RE:
                System.out.println("음 이름 : 레");
                break;
            case MI:
                System.out.println("음 이름 : 미");
                break;
            case FA:
                System.out.println("음 이름 : 파");
                break;
            default:
                System.out.println("음 이름 : 솔, 라, 시");
        }
    }
}

출력 결과값은 다음과 같습니다.

DO
음 이름 : 도

 

그렇다면 열거형 이전의 문제점이 해결되었는지 아래의 코드로 확인해보겠습니다.

public enum Animal {
    DOG, CAT
}

public enum Person {
    MAN, WOMAN
}

public class SafeEnum {
    public static void main(String[] args) {
        who(Person.MAN);
        who(Animal.DOG);
        Animal animal = Person.MAN;
    }

    public static void who(Person who) {
        switch (who) {
            case MAN:
                System.out.println("남자입니다.");
                break;
            case WOMAN:
                System.out.println("여자입니다.");
                break;
        }
    }
}

 

열거형 Animal 과 Person 이 정의되었습니다.

코드를 실행시켜보지만 아래의 코드에서 자료형 불일치로 인한 컴파일 오류가 발생합니다.

따라서 앞서 소개한 자바 5 이전의 문제점이 열거형을 사용할 경우 발생하지 않습니다.

        who(Animal.DOG);
        Animal animal = Person.MAN;

클래스 내에 열거형 정의

특정 클래스 내에서만 사용하고자 하는 열거형 값이 있다면, 아래의 코드와 같이 정의하면 됩니다.

public class Customer {

    enum Gender {
        MALE, FEMALE
    }

    private String name;
    private Gender gender;

    public Customer(String name, String gender) {
        this.name = name;

        if ("man".equals(gender)) {
            this.gender = Gender.MALE;
        } else {
            this.gender = Gender.FEMALE;
        }
    }

    @Override
    public String toString() {
        if (gender == Gender.MALE) {
            return "Mr " + name;
        } else {
            return "Ms " + name;
        }
    }
}

public class InnerEnum {
    public static void main(String[] args) {
        Customer customer1 = new Customer("Park", "man");
        Customer customer2 = new Customer("Han", "woman");

        System.out.println(customer1);
        System.out.println(customer2);
    }
}

 

출력 결과값은 다음과 같습니다.

Mr Park
Ms Han

열거형 값의 정체

진행하기 전에 먼저 다음과 같이 클래스 정의가 가능함을 소개하고자 합니다.

public class Person {
    public static final Person MAN = new Person();
    public static final Person WOMAN = new Person();

    @Override
    public String toString() {
        return "I am Person";
    }
}

public class InClassInst {
    public static void main(String[] args) {
        System.out.println(Person.MAN);
        System.out.println(Person.WOMAN);
    }
}

 

출력 결과값은 다음과 같습니다.

I am Person
I am Person

 

위 코드에서 보이듯이 Person 클래스 내에서 Person 형 참조변수를 선언하는 것도, Perosn 인스턴스를 생성하는 것도 가능합니다.

그럼 다음 코드를 보겠습니다. 이 코드에서는 열거형 값이 해당 자료형의 인스턴스라는 사실을 알려줍니다.

public enum Person {
    MAN, WOMAN;

    @Override
    public String toString() {
        return "Enum Person Object";
    }
}

public class EnumConst {
    public static void main(String[] args) {
        System.out.println(Person.MAN);
        System.out.println(Person.WOMAN);
    }
}

 

출력 결과값은 다음과 같습니다.

Enum Person Object
Enum Person Object

 

위 결과에서 확인할 수 있는 점은 다음과 같습니다.

  1. 열거형은 클래스입니다.
    모든 열거형은 java.lang.Enum<E> 클래스를 상속합니다.
    그리고 Enum<E> 는 Object 클래스를 상속합니다.
    이러한 측면에서 볼 때 열거형은 클래스입니다.
  2. 열거형의 값은 참조변수 입니다.
    이에 대한 증거로 출력 결과값에서 toString 메소드가 호출되었음을 보면 알 수 있습니다.

열거형의 정의에도 생성자가 따로 없다면 디폴트 생성자가 삽입됩니다.

다만 이 생성자는 private으로 선언되어 직접 인스턴스를 생성하는 것이 불가능할 뿐입니다.

이번에는 열거형 생성자를 정의해봄으로서, 열거형 값의 정체를 더 알아보겠습니다.

public enum Person {
    MAN, WOMAN;

    private Person() {
        System.out.println("Person 생성자 호출");
    }

    @Override
    public String toString() {
        return "Enum Person Object";
    }
}

public class EnumConstructor {
    public static void main(String[] args) {
        System.out.println(Person.MAN);
        System.out.println(Person.WOMAN);
    }
}

 

출력 결과값은 다음과 같습니다.

Person 생성자 호출
Person 생성자 호출
Enum Person Object
Enum Person Object

 

위 코드에서는 두 개의 열거형 값이 존재하기에 두 번의 생성자 호출이 이뤄졌습니다.

따라서 열거형 값의 정체는 다음과 같이 표현할 수 있습니다.

열거형 값은 생성자가 private이라 실제 컴파일은 되지 않습니다.

public static final Person MAN = new Person();
public static final Person WOMAN = new Person();

열거형의 생성자 정의 방법과 호출 방법

public enum Person {
    MAN(29),
    WOMAN(25);

    int age;

    private Person(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" + "age=" + age + '}';
    }
}

public class EnumParamConstructor {
    public static void main(String[] args) {
        System.out.println(Person.MAN);
        System.out.println(Person.WOMAN);
    }
}

 

출력 결과값은 다음과 같습니다.

열거형의 생성자는 무조건 private 으로 선언해야 합니다.

그리고 열거형 값의 선언에서 아래의 코드와 같이 소괄호를 통해서 생성자에 인자를 전달할 수 있습니다.

Person{age=29}
Person{age=25}

 

결론은 간단합니다.

열거형도 Object 클래스를 상속하는 일종의 클래스입니다.

따라서 생성자는 물론, 인스턴스 변수와 메소드 둘 다 가질 수 있습니다.

다만 모든 생성자를 private으로 선언해야 하기 때문에 열거형 값이 유일한 인스턴스 생성 방법이라는 차이가 있을 뿐입니다.

 

 

오늘도 좋은 하루 보내세요.

감사합니다.

반응형

'JAVA > 기본 개념' 카테고리의 다른 글

#11 Optional  (0) 2022.09.05
#5 추상 클래스 (Abstract Class)  (0) 2022.08.24
#8 Object 클래스  (0) 2022.08.23
#4 예외처리(Exception Handling)  (0) 2022.08.22
#3 인터페이스  (0) 2022.08.22
반응형

추상클래스와 인터페이스의 차이점

  1. 추상 클래스는 접근제어자가 public, protected, private 인 메소드를 가질 수 있습니다.
    반면에 인터페이스는 public 메소드만 가질 수 있습니다.
  2. 추상 클래스에는 멤버변수 선언이 가능하지만 인터페이스는 public static 변수만 선언이 가능합니다.
  3. 추상클래스는 구현 클래스에서 extends 예약어를 사용합니다.
    인터페이스는 구현 클래스에서 implements 예약어를 사용합니다.

 

 

 

이상입니다.

오늘도 좋은 하루 보내세요.

감사합니다.

반응형

'JAVA > 호기심천국' 카테고리의 다른 글

#1 @Override 를 쓰는 이유  (0) 2022.08.23
반응형

추상 클래스의 특징

1. 추상 메소드를 하나라도 가진 클래스입니다.

여기서 추상 메소드란 메소드의 선언부만 존재하고, 구현부는 없는 메소드입니다.

2. 클래스이기 때문에 변수를 가질 수 있습니다.

3. 추상 클래스를 extends 한 클래스가 추상 메소드를 구현하도록 강제합니다.

4. 추상 메소드에 필수적으로 abstract 예약어를 작성해야 합니다.

자바에서 추상 메소드는 다음과 같이 작성합니다.

abstract 반환형 메소드명();

5. 추상 클래스는 인스턴스를 생성할 수 없습니다.

6. 구현 클래스에서는 extends 예약어를 사용합니다.


자바에서 추상 클래스를 사용하는 목적

중복되는 부분이나 공통적인 부분은 공통 메소드를 사용하고,

구현 클래스에 따라 메소드의 동작 방식의 변경이 필요한 경우에는 공통의 메소드를 오버라이딩하여 사용함으로서 아래의 이점을 얻을 수 있습니다.

 

1. 생산성의 향상을 도모

2. 연관된 일련의 클래스들에 대해 공통적인 규약을 정의

 

아래의 코드는 그 목적에 맞게 추상 클래스를 이용한 코드입니다.

public abstract class Animal {
    private final String name;
    private final int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void information() {
        System.out.println("이름은 " + name);
        System.out.println("나이는 " + age);
    }
    abstract void cry();
}

public class Dog extends Animal{

    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    void cry() {
        System.out.println("멍멍");
    }
}

public class Cat extends Animal{

    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    void cry() {
        System.out.println("야옹");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog("Park", 11);
        Animal cat = new Cat("Han", 10);

        dog.information();
        cat.information();

        dog.cry();
        cat.cry();
    }
}

 

결과값은 다음과 같습니다.

이름은 Park
나이는 11
이름은 Han
나이는 10
멍멍
야옹

추상 클래스는 말 그대로 인스턴스를 생성할 수 없습니다.

아래의 코드와 같이 익명 클래스를 구현해서 사용하는 방법 밖에는 없습니다.

Animal animal = new Animal() {
            @Override
            public void cry() {
                System.out.println("익명 클래스");
            }
        };

 

이상입니다.

 

오늘도 좋은 하루 보내세요.

감사합니다.

반응형

'JAVA > 기본 개념' 카테고리의 다른 글

#11 Optional  (0) 2022.09.05
#10 열거형(Enum)  (0) 2022.08.31
#8 Object 클래스  (0) 2022.08.23
#4 예외처리(Exception Handling)  (0) 2022.08.22
#3 인터페이스  (0) 2022.08.22

+ Recent posts