728x90

Final

1-1. final 클래스

  • 자바에서 final 클래스는 다른 클래스가 그것을 상속받을 수 없게 하는 특별한 종류의 클래스이다.
  • final 키워드를 클래스 선언에 추가함으로써, 해당 클래스는 ‘최종적’이며 변경할 수 없다는 것을 의미한다.

final 클래스의 필요성

  1. 불변성 보장
    • 클래스가 일단 생성되면 그 상태가 변경되지 않도록 함으로써, 안정성과 보안을 향상시킨다.
  2. 상속 방지
    • 특정 클래스의 설계와 구현이 그대로 유지되어야 할 때 중요하다.
  3. 불변 클래스 생성
    • final 클래스는 불변 객체를 만드는 데 유용한다.
    • 불변 객체는 생성 후 그 상태가 변경되지 않으므로, 여러 면에서 프로그램의 신뢰성을 높일 수 있다.
  4. 성능 최적화
    • 컴파일러와 JVM은 final 클래스에 대해 성능 최적화를 수행할 수 있다.
    • final 클래스의 메소드는 오버라이딩되지 않기 때문에, 컴파일 타임에 메소드 호출이 결정될 수 있어, 실행 시간이 단축될 수 있다ㅏ.

final 클래스의 특성

  • 확장 불가능
    • 다른 클래스는 final 클래스를 상속받을 수 없다.
    • → 이는 final 클래스의 모든 메소드가 상속되거나 오버라이딩될 수 없음을 의미한다.
  • 메소드 오버라이딩 방지
    • final 클래스 내의 모든 메소드는 자동으로 final 로 간주된다.

💡 final 클래스는 코드의 안정성과 유지 보수성을 높이는 데 기여할 수 있으며, 특정한 사용 사례에서 중요한 역할을 한다. 클래스의 설계 의도를 명확히 하고, 불필요한 상속과 변경을 방지하여 프로그램의 견고성을 높이고자 할 때 final 클래스를 사용하는 것이 좋다.


1-2. final 클래스 예제

final class SecurityConfig {
    private static final String ENCRYPTION_KEY = "ComplexKey123!";

    private SecurityConfig() {
				// 생성자를 private으로 선언하여 외부에서 인스턴스화 방지
    }

    public static String getEncryptionKey() {
        return ENCRYPTION_KEY;
    }
}

public class FinalEx {
    public static void main(String[] args) {
        String encryptionKey = SecurityConfig.getEncryptionKey();
        System.out.println("암호화 키: " + encryptionKey);
    }
}
  • SecurityConfig 클래스 : final 로 선언되어 있어 상속 불가능
  • Private 생성자 : 클래스 외부에서 인스턴스를 생성할 수 없다.
  • 클래스가 유틸리티 목적으로만 사용되도록 의도된 것
  • Main 클래스 : SecurityConfig 클래스의 정적 메소드를 호출하여 암호화 키를 가져옴
  • 이 예제는 final 클래스를 사용하여 클래스의 불변성을 보장하고, 보안 관련 중요한 설정이 외부에서 변경되는 것을 방지하는 방법을 보여준다.

1-3. Java JDK의 final 클래스

  • JDK 내에서 final 클래스의 사용은 주로 안정성과 불변성을 확보하기 위해 이루어진다.
  • (변경되어서는 안되는 중요한 클래스들이 포함)
  • java.lang.String , java.lang.Math , java.lang.System , java.util.Collections 등
  • → 정적 메소드만 사용가능

2-1. final 필드

  • 자바에서 final 필드는 한 번 초기화되면 그 값을 변경할 수 없는 필드를 의미한다.
  • 상수를 정의하거나, 객체의 불변성을 보장하는 데 사용

final 필드의 필요성

  1. 상수 정의
    • 수학적 상수, 설정 값 등 프로그램 전반에 걸쳐 일관되게 사용되어야 하는 값들을 final 필드로 정의
  2. 불변 객체 생성
    • 객체의 불변성을 보장하려면, 객체가 생성된 후에는 그 상태가 변경되지 않도록 해야함
    • → 객체의 예측 가능성과 신뢰성을 높인다.
  3. 스레드 안정성
    • 멀티스레딩 환경에서 final 필드는 스레드 간의 안전한 읽기 작업을 보장한다.
    • 한 번 초기화된 final 필드의 값은 변경되지 않으므로, 스레드 간에 동기화 없이 안전하게 읽을 수 있다.
  4. 메모리 가시성 보장
    • 객체가 생성될 때 한 번만 쓰여지고, 이후에는 변경되지 않기 때문에, JVM은 메모리 가시성을 보장한다.
    • 즉, final 필드의 값은 모든 스레드에게 일관되게 보여진다.

final 필드의 특성

  • 초기화 제한
    • final 필드는 선언 시 또는 생성자에서만 초기화할 수 있다.
  • 객체의 핵심 속성 보호
    • 객체가 특정한 상태를 유지해야 할 때, 예를 들어 설정 값이나 중요한 데이터를 final 필드로 선언함으로써, 해당 값의 무결성을 유지할 수 있다.

💡 final 필드는 프로그램의 안정성과 무결성을 높이는 중요한 방법이다. 이러한 필드는 프로그램이 더욱 견고하고 안정적으로 동작하도록 돕고, 예측 가능한 동작을 보장하는 데 기여한다.


2-2. final 필드 예제

class Person {
    private final int id;
    private String name;

    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class FinalFieldEx {
    public static void main(String[] args) {
        Person person = new Person(1001, "John Doe");
        System.out.println("사람의 ID: " + person.getId());
        System.out.println("사람의 이름: " + person.getName());

        person.setName("Jane Doe");
        System.out.println("변경된 이름: " + person.getName());
    }
}
  • Person 클래스, 생성자
    • Person 객체가 생성될 때, 식별 번호와 이름은 생성자를 통해 초기화된다. 식별 번호는 final 필드이므로, 이후에는 변경 불가

3-1. final 메소드

  • 한 번 선언되면 하위 클래스에서 오버라이딩(재정의)할 수 없다.
  • → 클래스의 핵심적인 기능을 안정적으로 유지하기 위해 사용된다.

final 메소드의 필요성

  1. 메소드의 무결성 보장
    • final 메소드는 변경되거나 재정의될 수 없다.
  2. 오버라이딩 방지
  3. 보안 강화
  4. 예측 가능한 동작
    • 개발자는 final 메소드가 항상 동일한 방식으로 동작한다는 것을 알고 있으므로, 의도치 않은 오류나 버그를 줄일 수 있다.

final 메소드의 특성

  • 재정의 불가능
  • 클래스의 동작 보호

💡 final 메소드는 객체 지향 프로그래밍에서 클래스의 기능을 보호하고, 안정적인 동작을 보장하는 중요한 도구이다. 이는 프로그램의 견고성을 높이고, 예상치 못한 동작으로부터 시스템을 보호하는 데 중요한 역할을 한다.


3-2. final 메소드 예제

class BankAccount {
    private final int accountNumber;
    private double balance;

    public BankAccount(int accountNumber, double initialBalance) {
        this.accountNumber = accountNumber;
        this.balance = initialBalance;
    }

    public final String getAccountInfo() {
        return "계좌 번호: " + accountNumber + ", 잔액: " + balance;
    }

    public void deposit(double amount) {
        balance += amount;
    }

    public void withdraw(double amount) {
        balance -= amount;
    }
}

public class FinalMethodEx {
    public static void main(String[] args) {
        BankAccount account = new BankAccount(12345, 1000.0);
        System.out.println(account.getAccountInfo());   // 계좌 번호: 12345, 잔액: 1000.0
        account.deposit(500);
        System.out.println(account.getAccountInfo());   // 계좌 번호: 12345, 잔액: 1500.0
        account.withdraw(200);
        System.out.println(account.getAccountInfo());   // 계좌 번호: 12345, 잔액: 1300.0
    }
}
  • final 메소드는 클래스의 동작을 안정적으로 유지하고, 프로그램의 신뢰성을 향상시키는 데 기여한다.
728x90

'Spring > TIL - 멋쟁이사자처럼' 카테고리의 다른 글

TIL - 3월 27일 : HTML  (1) 2024.03.29
728x90

HTML

인터넷과 웹의 시작

미국 국방성에서 시작. 1969년 현재 인터넷의 모태가 되는 ARPANET이 개발되었다. 1989년 팀 버너스 리는 월드 와이드 웹(World Wide Wep, WWW)을 개발하였다. 문서와 문서를 연결하는 하이퍼링크(Hyper Link) 개념이 도입되었고, 1991년에 배포되었으며 1993년에 소스코드가 공개되었다.

 

웹 브라우저의 역사

  • 1993년 : 최초의 GUI 환경의 '모자이크' 탄생
  • 1996년 ~ 2008년 말 : 1차 브라우저 전쟁. 모자이크를 개발했던 마크 엔더리슨은 '넷스케이프'를, 마이크로소프트는 '인터넷 익스플로러'를 개발. 운영체제에 기본으로 탑제되어 제공되던 익스플로러가 넷스케이프를 이기고 대부분의 점유율을 확보
  • 2008년 12월 : 구글 크롬 정식 출시
  • 2010년 : 인터넷 익스플로러가 최신 표준을 지원하지 않는 문제가 발생
  • 2009년 ~ 2015년 : 2차 브라우저 전쟁. 2022년 2월 기준 데스크탑 64.89%의 점유율로 크롬이 승리

HTML5

최신 웹 기술로, 단순히 웹 문서를 작성할 때 사용되는 마크업 랭귀지(HTML)의 문법적(syntactic) 버전 뿐만 아니라 새로운 DOM API 스펙을 포함한다. 일렉트론(Electron)등의 기술을 사용하면 애플리케이션 웹 기반으로 개발이 가능하다.

 

시작 태그, 끝 태그, 내용

<h1>Hello</h1>
  • 시작 태그 : <h1>
  • 끝 태그: </h1>
  • 내용: Hello
  • 요소(element): 시작 태그 + 내용 + 끝 태그
  • 내용엔 다른 요소들이 올 수도 있다.

속성

<a href="http://www.naver.com">naver</a>

 

 

기본 구조

<!DOCTYPE html>
<html>
    <head>
        <title>문서의 제목</title>
    </head>
    <body>
        문서의 내용
    </body>
</html>

 

head

웹 브라우저에 문서 정보를 알려주는 태그. 화면에 보이는 부분은 아니다. <mata>, <title> 등이 쓰이고 스타일시트 파일도 이곳에서 연결해준다.

 

meta 태그

  1. 문자셋 정의: 문서의 문자 인코딩을 지정
<mate charset="UTF-8">

2. 뷰포트 설정: 반응형 웹 디자인에 필수적인 속성. 모바일 브라우저에서 페이지가 어떻게 보여질지 제어한다.

<meta name="viewport" content="width=device-width, initial-scale=1.0">

3. 키워드: 페이지 내용과 관련된 키워드를 제공하고 검색엔진 최적화(SEO)에 도움이 된다.

<meta name="keywords" content="HTML, CSS, JavaScript">

4. 웹 페이지 설명: 웹 페이지의 간단한 설명을 제공. 검색엔진의 검색결과에서 페이지 아래에 표시되는 설명문

<meta name="description" content="Html 구조에 대해 설명합니다.">

이외에도 저자 설명, 리프레시 설정, 캐시 제어, 오픈 그래프 메타태그 등의 설정을 할 수 있게 해주는 태그이다.


html 태그 종류

제목

h1, h2, h3, h4, h5, h6

h1은 가장 큰 제목, h6는 가장 작은 제목

 

줄바꿈

<br />

 

가로줄

<hr />

 

앵커

하이퍼링크 태그를 의미한다. 내용 부분을 클릭하면 해당 주소로 이동

<a href="주소">내용</a>

 

글자의 모양

<b>, <i>, <small>, <sub>, <sup>, <ins>, <del>

글자의 모양은 태그를 이용하지 않고 보통 CSS를 이용하는 것이 좋다

 

목록 태그/기본 목록

<ul> 순서가 없는 목록을 표현

<ol> 순서가 있는 목록을 표현

<li> 목록의 요소

 

목록 태그/정의 목록

<dl> 정의 목록 태그

<dt> 정의 용어 태그

<dd> 정의 설명 태그

 

테이블 태그

<table> 표

<tr> 표 내부의 행

<th> 제목 셀 태그

<td> 일반 셀 태그

 

- 테이블 속성

border 표의 테두리 두께

rowspan 세로로 셀 합치기

colspan 가로로 셀 합치기

 

이미지 태그

<img> 이미지

 

- 이미지 속성

src 이미지 경로

alt 이미지 설명

width 이미지 너비

height 이미지 높이

 

멀티미디어 태그

<audio> 오디오 파일

<video> 비디오 파일

 

입력양식 태그

form 입력 폼

input 입력 창

textarea 입력 영역

select 선택 폼

 

공간 분할 태그

<div> block 형식으로 공간 분할

<span> inline 형식으로 공간 분할

 

시멘틱 구조 태그

<header> 헤더

<nav> 네비게이션

<aside> 사이드에 위치하는 공간

<section> 여러 중심 내용을 감싸는 공간

<article> 내용

<footer> 푸터

<address> 주소

 

실습문제1 - 자기소개 페이지 만들기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>자기소개 페이지</title>
</head>
<body>
    <header>
        <h1>지유빈의 자기소개 페이지</h1>
    </header>
    <hr/>
    <main>
        <img src="intro.png" alt="자기소개사진">
        <section>
            <h2>기본 자기소개</h2>
            <p>안녕하세요. 저는 멋쟁이사자처럼 백엔드스쿨 10기생 박경서입니다.</p>
            <p>저는 백엔드에 대해 공부하고 혼자서도 웹 페이지를 만들어보고싶습니다.</p>
        </section>
        <hr/>
        <section>
            <h2>취미 및 관심사</h2>
            <p>저의 취미는 야구 직관입니다.</p>
            <p>요즘 관심은 모루인형 만들기입니다.</p>
        </section>
        <hr/>
        <blockquote>늦었다고 생각할 때가 진짜 늦었다</blockquote>
        <cite>박명수</cite>
    </main>
    <hr/>
    <footer>
        <p>연락처 및 주소</p>
        <address>
            <p>주소 - 경기도 수원시</p>
            <p>연락처 - 010-1111-2222</p>
        </address>
    </footer>
</body>
</html>

실습문제2 - 블로그 포스트 페이지 만들기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>블로그 페이지</title>
</head>
<body>
    <header>
        <h1>HTML의 기본</h1>
        <p><small>2024-03-27 박경서</small></p>
    </header>
    <hr/>
    <main>
        <img src="html.png" alt="html아이콘">
        <p>오늘은 <strong>html의 기본</strong>을 배워보았다.</p>
        <p><em>다양한 태그</em>를 이용해 실습도 해보았다.</p>
        <a href="https://www.tcpschool.com/html-tag-attrs/img-alt" target="_blank">실습의 기본</a>
    </main>
    <hr/>
    <section>
        <h4>댓글</h4>
        <ul>
            <li>재밌었겠내요</li>
            <li>저도 배워보고 싶어요</li>
            <li>다음엔 어떤 걸 배우나요?</li>
        </ul>
    </section>
</body>
</html>

실습문제3 - 제품 소개 페이지

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>제품 소개 페이지</title>
</head>
<body>
    <header>
        <h1>갤럭시 제품 소개</h1>
        <p>갤럭시는 한국 최고 기업 삼성에서 만들어진 최고의 스마트폰입니다.</p>
    </header>
    <hr/>
    <main>
        <img src="g1.jpg" alt="갤럭시사진1" width="400px">
        <img src="g2.jpg" alt="갤럭시사진1" width="400px">
        <ul>
            <li>예쁜 색감</li>
            <li>좋은 기능</li>
        </ul>
    </main>
    <hr/>
    <hr/>
    <section>
        <article>
            <h3>사용자1</h3>
            <p>너무 잘 쓰고있어요.</p>
        </article>
        <hr/>
        <article>
            <h3>사용자2</h3>
            <p>약간 버벅거려요.</p>
        </article>
        <hr/>
    </section>
    <footer>
        <p>제품 구매 페이지</p>
        <a href="https://search.naver.com/search.naver?ssc=tab.nx.all&where=nexearch&sm=tab_jum&query=%EA%B0%A4%EB%9F%AD%EC%8B%9C" target="_blank">구매 관련 홈페이지</a>
    </footer>
</body>
</html>
728x90

'Spring > TIL - 멋쟁이사자처럼' 카테고리의 다른 글

4월 11일 TIL : final  (0) 2024.05.03

+ Recent posts