orElse vs orElseGet

Java에서 Optional<T>을 사용할 때, orElse와 orElseGet은 Optional이 비어 있을 경우 기본값을 제공하는 메서드이다.
하지만 두 메서드가 작동하는 방식에는 중요한 차이점이 있다.

핵심 차이:

  • orElse(T other): 기본값을 항상 계산하고, Optional이 비어 있으면 반환.
  • orElseGet(Supplier<? extends T> supplier): Optional이 비어 있을 때만 기본값을 계산.

1. orElse 동작 방식

기본값을 "항상" 계산하는 메서드

  • Optional이 값이 있든 없든 항상 orElse에 전달된 값이 평가(계산)된다.
  • 즉, Optional이 값이 있을 때도 불필요한 연산이 실행될 수 있다.

orElse 예제

public class OrElseExample {
    public static String getDefaultValue() {
        System.out.println("getDefaultValue() 호출됨");
        return "기본값";
    }

    public static void main(String[] args) {
        Optional<String> optional = Optional.ofNullable("안녕하세요");

        String result = optional.orElse(getDefaultValue()); // getDefaultValue()가 실행될까?
        System.out.println("결과: " + result);
    }
}

실행 결과

getDefaultValue() 호출됨
결과: 안녕하세요

 

왜 이런 결과가 나왔을까?

  • Optional에는 "안녕하세요"라는 값이 이미 존재한다.
  • 그런데도 getDefaultValue()가 무조건 실행되었다.
  • 즉, 기본값이 필요하지 않더라도 연산이 발생하는 비효율적인 상황이 생길 수 있다.

2. orElseGet 동작 방식

기본값을 "필요할 때만" 계산하는 메서드

  • Optional이 비어 있을 때만 Supplier(람다 함수)를 실행한다.
  • 즉, 값이 존재하면 불필요한 연산을 하지 않는다.

orElseGet 예제

public class OrElseGetExample {
    public static String getDefaultValue() {
        System.out.println("getDefaultValue() 호출됨");
        return "기본값";
    }

    public static void main(String[] args) {
        Optional<String> optional = Optional.ofNullable("안녕하세요");

        String result = optional.orElseGet(() -> getDefaultValue()); // getDefaultValue()가 실행될까?
        System.out.println("결과: " + result);
    }
}

실행 결과

결과: 안녕하세요

 

이번에는 getDefaultValue()가 실행되지 않았다!

  • Optional에 "안녕하세요"라는 값이 있으므로 기본값을 만들 필요가 없기 때문이다.
  • 즉, orElseGet은 연산을 최소화할 수 있도록 도와준다.

 

3. orElse vs orElseGet 비교

비교 표

메서드 기본값 평가 시점 최적화 가능 여  언제 사용해야 할까?
orElse(T other) 항상 평가됨 ❌ 비효율적
(불필요한 연산 가능)
기본값이 가벼운 경우
orElseGet(Supplier<? extends T> supplier) 필요할 때만 평가됨 ✅ 최적화 가능 기본값을 생성하는 연산이 무거운 경우
(DB 조회, 파일 읽기 등)

orElse의 문제점

Optional<String> optional = Optional.ofNullable("데이터 있음");
String result = optional.orElse(getDataFromDatabase()); // DB 조회가 필요할까?
  • Optional에 값이 있음에도 DB 조회가 실행됩니다!
  • 연산 비용이 큰 작업이 불필요하게 실행될 수 있습니다.

해결 방법 → orElseGet 사용

Optional<String> optional = Optional.ofNullable("데이터 있음");
String result = optional.orElseGet(() -> getDataFromDatabase()); // 필요할 때만 실행됨!
  • Optional이 비어 있을 때만 DB 조회가 실행됩니다.
  • 연산 비용이 큰 작업일 경우, 반드시 orElseGet을 사용하세요.

4. 실전 예제: 성능 차이 확인

orElse vs orElseGet 비교 실험

public class OrElseVsOrElseGet {
    public static String expensiveOperation() {
        System.out.println("💰 비용이 큰 연산 실행 중...");
        return "연산 결과";
    }

    public static void main(String[] args) {
        System.out.println("📌 `orElse` 사용:");
        Optional<String> optional1 = Optional.of("값 있음");
        String result1 = optional1.orElse(expensiveOperation());

        System.out.println("\n📌 `orElseGet` 사용:");
        Optional<String> optional2 = Optional.of("값 있음");
        String result2 = optional2.orElseGet(() -> expensiveOperation());
    }
}

실행 결과

📌 `orElse` 사용:
💰 비용이 큰 연산 실행 중...

📌 `orElseGet` 사용:
  • orElse는 값이 있어도 expensiveOperation()이 실행됨. (비효율적❌)
  • orElseGet은 값이 있으면 실행되지 않음. (최적화 가능✅)

 

5. 언제 orElse를 쓰고 언제 orElseGet을 써야 할까?

기본값이 간단한 값이라면 → orElse 사용

String result = optional.orElse("기본값");
  • "기본값"처럼 가벼운 값이라면 orElse가 편리함.

기본값을 생성하는 연산이 무겁다면 → orElseGet 사용

String result = optional.orElseGet(() -> getDataFromDatabase());
  • getDataFromDatabase()처럼 실행 비용이 큰 경우, orElseGet을 사용하여 불필요한 연산을 방지.

 

결론

  • orElse는 기본값 연산이 항상 실행되므로, 연산 비용이 크다면 orElseGet을 사용하는 것이 좋다.
  • orElseGet은 Optional이 비어 있을 때만 연산하므로, 불필요한 연산을 방지할 수 있다.
  • 성능 최적화를 위해 기본값을 미리 계산할 필요가 없는 경우 orElseGet을 적극 활용하자!

 

참조
https://ysjune.github.io/posts/java/orelsenorelseget/

'Web Programming Language > JAVA' 카테고리의 다른 글

BitSet 클래스  (0) 2025.02.17
DTO와 VO  (0) 2025.02.12
Records  (1) 2025.02.12
JAVA) print, printf, println 차이점  (0) 2021.03.11
JAVA) Java 프로그램 실행 구조  (0) 2020.11.18

변수와 상수의 차이와 활용

JavaScript에서 변수(variable)상수(constant)는 데이터를 저장하고 관리하는 핵심 요소이다.
var, let, const는 각각의 특성과 용도가 다르며, 코드 작성 시 이를 적절히 사용하는 것이 중요하다.

 

변수와 상수 선언 방법

1. var

  • 특징:
    • 재선언 및 재할당 가능.
    • 함수 스코프(Function Scope)를 가짐.
    • 블록 스코프를 지원하지 않음.
  • 사용 예:
    var name = "John";
    
    name = "Doe"; // 재할당 가능

주의: var는 의도치 않은 호이스팅 문제를 유발할 수 있으므로 현대 코드에서는 let과 const 사용이 권장된다.

 

2. let

  • 특징:
    • 재선언 불가능하지만 재할당 가능.
    • 블록 스코프(Block Scope)를 지원.
  • 사용 예:
let age = 25;

age = 26; // 재할당 가능

 

3. const

  • 특징:
    • 재선언 및 재할당 불가능.
    • 반드시 선언 시 초기화 필요.
    • 블록 스코프를 지원.
  • 사용 예:
const PI = 3.14;

// PI = 3.15; // Error: 재할당 불가능

 

변수와 상수의 주요 차이점

특성 var let const
재선언 가능 여부 Yes No No
재할당 가능 여부 Yes Yes No
초기화 필요 여부 No No Yes
스코프 함수 스코프 블록 스코프 블록 스코프

 

스코프(Scope)와 호이스팅(Hoisting)

1. 스코프

  • 함수 스코프: var로 선언된 변수는 함수 내에서만 유효.
  • 블록 스코프: let과 const는 {}로 감싼 블록 내에서만 유효.
if (true) {
  let x = 0;
}

console.log(x); // Error: x is not defined​

 

2. 호이스팅

  • JavaScript는 변수 선언을 코드의 상단으로 끌어올리는 호이스팅을 수행한다.
  • var는 선언부만 끌어올려져 초기화되지 않은 상태로 처리된다.
console.log(a); // undefined
var a = 5;

console.log(b); // Error: Cannot access 'b' before initialization
let b = 10;​

 

let과 const의 추천 사용법

1. const를 기본적으로 사용.
값이 변하지 않는 데이터를 선언할 때 사용

const maxUsers = 100;
 

2. 필요할 때만 let 사용.
동적으로 변경되는 데이터에 적합

let userCount = 0;
userCount++;

 

 

3. var는 사용하지 않음.
var의 함수 스코프와 호이스팅 문제는 유지보수에 적합하지 않다.

 

객체와 배열의 상수 처리

const로 선언된 객체와 배열은 내부 데이터 변경이 가능하다.

const user = { name: "Alice" };
user.name = "Bob"; // 가능

const numbers = [1, 2, 3];
numbers.push(4); // 가능

 

하지만 참조 자체를 변경하는 것은 불가능합니다:

user = { name: "Charlie" }; // Error: 재할당 불가능

 

변수 선언 관련 유용한 팁

 

1. 명확한 변수 이름 사용:
변수의 목적을 쉽게 알 수 있도록 작성

let userAge = 30; // 명확한 변수명

 

2. 초기화와 함께 선언:

선언과 초기화를 동시에 하여 예측 가능한 코드를 작성

const isLoggedIn = false;

3. 스코프를 잘 이해하고 활용:
불필요한 전역 변수 사용을 지양

 

요약

  • var 대신 let과 const를 사용
  • const는 값을 변경하지 않을 때, let은 변경 가능성이 있을 때 사용한다.
  • 스코프와 호이스팅의 작동 방식을 이해하면 코드 오류를 줄이고 가독성을 높일 수 있다.

최적의 코드 작성: 명확한 변수 선언과 스코프 활용은 코드 품질을 높이고, 협업 시 이해도를 향상시킨다.

 

 

 

참조
https://tcpschool.com/javascript/js_intro_syntax#google_vignette

https://ko.javascript.info/variables

https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-var-let-const-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EB%B3%80%EC%88%98-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85#thankYou

 

 

'Web Programming Language > JS' 카테고리의 다른 글

JavaScript란?  (0) 2024.12.03
JavaScript) eval() 함수  (0) 2020.10.29
java script) history.back(), history.go(), history.forward()  (0) 2020.10.27

JavaScript란 무엇인가?

JavaScript는 웹 페이지를 동적으로 만들기 위해 사용하는 프로그래밍 언어로, 주로 브라우저에서 실행된다.
HTML 및 CSS와 함께 웹 개발의 핵심 기술로 자리 잡았으며, 다양한 기능을 통해 사용자 경험을 풍부하게 한다.

 

JavaScript의 정의

  • 정의: JavaScript는 클라이언트에서 실행되며, HTML 및 CSS와 함께 동작해 웹 페이지를 동적으로 제어한다.
  • 역사: 초창기에는 브라우저 내에서 간단한 동작을 수행하기 위해 개발되었으나, 현재는 서버, 앱, 게임 개발 등으로 확장되었다.

대표적인 실행 환경:

  • 브라우저: Chrome(V8 엔진), Firefox(SpiderMonkey), Edge(Chakra), Safari(WebKit).
  • 서버: Node.js.

 

브라우저에서 JavaScript로 할 수 있는 일

JavaScript는 브라우저에서 다양한 동적 기능을 제공한다.

  1. HTML 콘텐츠 조작:
    페이지 내용을 실시간으로 수정하거나 업데이트.
  2. 이벤트 처리:
    클릭, 입력, 스크롤 등의 사용자 인터랙션에 반응.
  3. 데이터 통신:
    AJAX를 통해 서버와 비동기적으로 데이터 송수신.
  4. 애니메이션 효과:
    요소의 움직임과 변화를 부드럽게 구현.

 

브라우저에서 JavaScript로 할 수 없는 일

브라우저의 JavaScript는 보안상의 이유로 몇 가지 제한이 있다.

  • 파일 시스템 접근.
  • 운영 체제나 하드웨어 직접 제어.
  • 다른 도메인의 서버 데이터에 접근(CORS 정책 적용).

 

JavaScript의 장점

  1. HTML/CSS와의 완벽한 통합:
    • 웹 페이지를 동적으로 업데이트 가능.
  2. 비동기 처리:
    • 비동기 통신(AJAX)을 통해 사용자 경험 개선.
  3. 광범위한 사용:
    • 브라우저뿐만 아니라 서버(Node.js), 모바일 앱에서도 사용 가능.

 

JavaScript의 확장 가능성

JavaScript는 다양한 파생 언어와 프레임워크를 통해 확장되었다.

  • TypeScript: JavaScript의 상위 언어로, 정적 타입을 제공.
  • Dart: Google이 개발한 언어로, JavaScript로 변환 가능.
  • Frameworks: React, Angular, Vue 등은 JavaScript로 강력한 웹 애플리케이션 개발을 지원.

 

요약

JavaScript는 웹 개발의 중심 기술로, 정적 콘텐츠에 생동감을 부여하고, 사용자와의 상호작용을 가능하게 한다.

  • 브라우저에서 실행: HTML, CSS와 통합.
  • 서버에서도 활용 가능: Node.js.
  • 강력한 확장성: 다양한 프레임워크와 라이브러리를 통해 현대적인 웹 개발을 지원.

 

참조:
https://ko.javascript.info/intro

'Web Programming Language > JS' 카테고리의 다른 글

변수와 상수  (0) 2024.12.03
JavaScript) eval() 함수  (0) 2020.10.29
java script) history.back(), history.go(), history.forward()  (0) 2020.10.27

basename() 함수 - 파일 이름 반환

 

1. basename - 역할

주어진 경로에서 파일 이름만 반환하는 함수.

 

 

1.1. 구문형식

 

basename(경로 , 접미사)

 

접미사가 입력되면 파일 이름에서 해당하는 접미사는 제거됨

 

 

 

2. basename - 예제

 

2.1. 코드

<body>
<?php
    
    $test_path = "/home/work/menu/test.php";
    
    echo basename ($test_path);
    echo "<br>";
    echo basename($test_path,".php");
?>
</body>

 

 

2.2. 결과화면

 

 

2.3. 설명

test_path는 경로를 나타내고 있고 basename() 함수를 통하여 파일 이름만 반환하고 있다.



 

 

참고 :

https://devjhs.tistory.com/211

'Web Programming Language > PHP' 카테고리의 다른 글

PHP) readfile() 함수  (0) 2021.01.15
PHP) HTTP Response Header - Content-Disposition 속성  (0) 2021.01.15
PHP) HTTP Header - MIME-Type, Content-Type  (0) 2021.01.14
PHP) shell_exec() 함수  (0) 2020.11.05
PHP) system() 함수  (0) 2020.11.05

print : 괄호안 내용을 단순히 출력. 개행문자(=줄바꿈문자=\n) 포함안됨.

printf : C에서의 printf와 동일. %d, %s 등을 쓰기위해 사용. 개행문자 포함X

println : 괄호안 내용을 출력한 후 마지막에 개행문자가 포함되어 있어 출력후 한 줄 띄워짐.

 

<예시>

public class ThreadTest extends Thread{
	public static void main(String[] args) {
		int num = 5;
		System.out.print("print ! " + num + "\n");	//print
		System.out.printf("printf ! %d \n", num);	//printf
		System.out.println("println ! " + num);		//println
	}
}

 

결과화면

println 에는 개행문자가 없는데 밑에 한칸 띄워져 있음 !

 

 

 

 

 

출처 :

moon1226.tistory.com/12

 

 

 

 

자바의 출력문(println, printf)

 

출력 - println()

 

개발자가 열심히 프로그래밍을 하더라도 결과를 볼 수 있는 명령문을 실행하지 않으면 절대 직접 눈으로 볼 수 없다. 결과를 봐야 이 프로그램이 내가 생각한대로 잘 돌아가고 있는지 알 수 있다. println은 자바에서의 기본 출력문으로 가장 많이 사용되며 출력하고 싶은 내용 그대로를 입력하여 출력한다.

 

println()

System.out.println("문자열");

          또는

System.out.println(변수명);

          또는

System.out.println("문자열"+변수명);

  • 문자열을 출력하기 위해서는 큰따옴표로 묶어줘야 한다.

  • 큰 따옴표 없는 것은 모두 변수명으로 인식한다. (입력한 변수명이 없을 경우 에러발생)

  • 문자열과 변수명을 함께 사용할 수 있으나 반드시 '+'로 연결시켜줘야 한다.

  • 가로안의 내용을 출력한 후 자동으로 줄바꾸는 기능이 있다.

Tip) 이클립스에서는 'sysout' 이라고 입력하고 'ctrl+space'를 누르면 System.out.println()이 자동 입력된다.

 

 

◈ 예제

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public class Println {

 

    public static void main(String[] args) {

        //기본 출력문 println()        

        //sysout + 자동완성(ctrl + space)

        

        int number = 10;

        String str = "안녕, 자바";

        

        System.out.println("Hello, World."); //문자열 출력

        System.out.println(number); //int형 변수 출력

        System.out.println(str); // String형 변수 출력

        System.out.println("내 나이는 "+number+"살 입니다."); // 문자열 + 변수 출력        

        

    }//main

 

}//class

                                                                             Colored By Color Scripter

 

실행 결과

Hello, World.

10

안녕, 자바

내 나이는 10살 입니다.

 

· String과 기본형은 저장된 값 그대로 출력된다.

· 변수와 문자열을 '+'로만 이어주면 같이 사용할 수 있다.

· 실행 결과를 보면 자동으로 내용을 출력 후 줄바꿈 기능이 있는걸 볼 수 있다. 절대로 명령문을 한줄에 하나씩 써서 줄바꿈이 된 것이 아니다.

 

 

 

No. 02

 

 

형식화된 출력 - printf()

 

기본 출력문은 println()은 변수의 값을 그대로 출력하므로, 값을 변환하지 않고는 다른 형식으로 출력할 수 없다.

반면에 printf()는 지시자를 통해 변수의 값을 여러 가지 형식으로 변환하여 출력할 수 있다.

 

printf()

System.out.printf("출력 서식",출력할 내용);

  • 출력 후 줄바꿈을 하지 않는다. 줄바꿈을 하려면 지시자 '%n'을 넣어줘야 한다.

  • 출력하려는 값의 수만큼 지시자도 사용해야 한다.

  • 출력될 값과 지시자의 순서는 일치해야 한다.

  • 지시자를 제외한 문자는 입력한 그대로 출력된다.

 

출력 서식

%[-][0][n][.m]지시자

  • 출력 서식의 지시자를 제외한 나머지는 생략 가능하다. 예) %d 식으로 사용 가능.

  • n : 출력할 전체 자리수 지정(오른쪽 정렬).  예) %3d, 전체자리수가 3인 정수

  • 0 : 전체 자리수가 지정된 경우 왼쪽의 남는 자리에 0을 출력.  예) %03d

  • - : 전체 자리수가 지정된 경우 왼쪽 정렬하고 빈칸에 공백 출력.

  • .m : 소수점 아래 자리수 지정. 잘리는 소수점 자리수는 반올림 시켜서 표시.  예)3.2f

 

 지시자

설명 

 %b

 boolean 형식으로 출력 

 %d

 정수 형식으로 출력

 %o

 8진수 정수의 형식으로 출력

 %x 또는 %X

 16진수 정수의 형식으로 출력

 %f

 소수점 형식으로 출력

 %c

 문자형식으로 출력 

 %s

 문자열 형식으로 출력

 %n  줄바꿈 기능

 %e 또는 %E

 지수 표현식의 형식으로 출력

 

 

◈ 예제1

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public class Printf {

 

    public static void main(String[] args) {

        

        int age = 10;        

        String addr = "경기도";

        

        //'%n'지시자를 사용 안 했을 경우

        System.out.printf("줄바꿈 기능");

        System.out.printf("없음.");

        

        //'%n'지시자를 사용한 경우

        System.out.printf("줄바꾸기%n");

        System.out.printf("성공!%n");

        

        System.out.printf("내 나이는 %d살 입니다.%n",age);

        System.out.printf("내 나이는 %d살 이고 %s에 살고 있습니다.%n",age,addr);

        

    }//main

 

}//class

                                                                  Colored By Color Scripter

 

실행 결과

줄바꾸기 기능없음.줄바꾸기

성공!

내 나이는 10살 입니다.

내 나이는 10살이고 경기도에 살고 있습니다.

 

· 기본적으로 줄바꿈 기능이 없고 '%n'지시자를 사용한 곳에서 줄바꾸는 기능을 하는 것을 볼 수 있다.

· 지시자의 수와 출력하려는 값의 수는 같아야 하며 출력하려는 값은 콤마(',')로 구분한다.

· 출력하려는 값은 지시자의 순서와 같아야 한다.

· 지시자의 형식과 출력하려는 값의 형식이 같지 않으면 에러가 발생한다.

 

 

◈ 예제2

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

public class Printf {

 

    public static void main(String[] args) {

        //자리수 지정은 안 했을 경우 왼쪽으로 정렬된다.

        System.out.printf("자리수 미지정 :%d%n",1);

        System.out.printf("자리수 미지정 :%d%n",10);

        System.out.printf("자리수 미지정 :%d%n",100);

        System.out.printf("자리수 미지정 :%d%n",1000);

        

        //자리수 지정했을 경우  오른쪽으로 정렬된다.(남는 자리수는 공백)

        System.out.printf("자리수 지정 :%4d%n",1);

        System.out.printf("자리수 지정 :%4d%n",10);

        System.out.printf("자리수 지정 :%4d%n",100);

        System.out.printf("자리수 지정 :%4d%n",1000);

        

        //자리수 지정 후 '-'사용하면 왼쪽으로 정렬된다.

        System.out.printf("자리수 지정('-'사용) :%-4d%n",1);

        System.out.printf("자리수 지정('-'사용) :%-4d%n",10);

 

        System.out.printf("자리수 지정('-'사용) :%-4d%n",100);

 

        System.out.printf("자리수 지정('-'사용) :%-4d%n",1000);

 

        

        //자리수 지정 후 '0'사용하면 오른쪽으로 정렬된다. (왼쪽 자리수는 0으로 채운다)

        System.out.printf("자리수 지정('0'사용) :%04d%n",1);

        System.out.printf("자리수 지정('0'사용) :%04d%n",10);

        System.out.printf("자리수 지정('0'사용) :%04d%n",100);

        System.out.printf("자리수 지정('0'사용) :%04d%n",1000);

        

    }//main

 

}//class

                                                                       Colored By Color Scripter

 

실행 결과

자리수 미지정 :1

자리수 미지정 :10

자리수 미지정 :100

자리수 미지정 :1000

자리수 지정 :    1 

자리수 지정 :  10

자리수 지정 : 100

자리수 지정 :1000

자리수 지정('-'사용) :1

자리수 지정('-'사용) :10

자리수 지정('-'사용) :100

자리수 지정('-'사용) :1000

자리수 지정('0'사용) :0001

자리수 지정('0'사용) :0010

자리수 지정('0'사용) :0100

자리수 지정('0'사용) :1000

 

 

◈ 예제3

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public class Printf {

 

    public static void main(String[] args) {

        

        float f = 1.2345f;

        

        //소수점 자리수 미지정시

        System.out.printf("소수점 자리수 미지정 : %f%n",f);

        //소수점 자리 지정시

        System.out.printf("소수점 자리수 지정 : %.3f%n",f);    

        

    }//main

 

}//class

                                           Colored By Color Scripter 

 

실행 결과

소수점 자리수 미지정 : 1.234500

소수점 자리 지정 : 1.235

 

· 소수점 자리를 3자리로 지정했기 때문에 4번째 자리에서 반올림한 결과를 출력한다.

 

 

 

출처 :

keep-cool.tistory.com/15

'Web Programming Language > JAVA' 카테고리의 다른 글

BitSet 클래스  (0) 2025.02.17
DTO와 VO  (0) 2025.02.12
Records  (1) 2025.02.12
orElse vs orElseGet 차이점  (0) 2025.02.12
JAVA) Java 프로그램 실행 구조  (0) 2020.11.18

함수설명 :

readfile 함수는 파일을 읽은 후, 출력을 합니다.

 

반환값 :

이 함수는 성공하거나 실패할 경우에 읽은 바이트 수를 반환합니다.

 

기타 :

함수 이름앞에 @를 붙이면, 출력 오류를 숨길 수 있습니다.

 

정의 : 

readfile(filename)

 

filename : 파일의 이름을 입력받습니다.

 

<?php
$file = '/usr/share/apache2/icons/ubuntu-logo.png';
if( !file_exists($file) ) {
	echo "파일이 없습니다.";
	exit;
}
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));

readfile($file);

 

 

이 함수를 실행하면,

해당 파일의 내용이 모두 웹 브라우저에 출력된다.

 

특정 파일의 내용을 출력할 때 사용할 수 있지만, 실제로는 해당 파일의 다운로드를 구현하기 위해 많이 사용된다.

 

일반적으로는, 파일의 링크를 연결해두고 클릭하면 다운로드 창이 뜨게 되지만, txt문서나 이미지 파일의 경우 웹 브라우저에서 지원하는 형식의 파일이면 파일 다운로드 창이 뜨지 않고 웹 브라우저에 바로 보여지게 된다.

 

이처럼 웹 브라우저에서 보이는 것을 방지하고 파일 다운로드 창이 뜨도록 하려면 파일의 형식을 속여야 한다.

 

 

 

 

출처 :

m.blog.naver.com/PostView.nhn?blogId=writer0713&logNo=220191525288&proxyReferer=https:%2F%2Fwww.google.com%2F

+ Recent posts