블록체인 학습
0 XP

private 가시성

private은 가장 폐쇄적인 가시성입니다. private으로 선언한 변수나 함수는 선언된 바로 그 컨트랙트 안에서만 접근할 수 있습니다. 외부 계정이나 다른 컨트랙트는 물론, 이 컨트랙트를 상속받은 자식 컨트랙트조차 접근할 수 없습니다. 컨트랙트 내부에서만 쓰는 보조 데이터나 헬퍼 함수를 외부에 노출하지 않으려 할 때 사용합니다.

private 은 다른 컨트랙트의 코드 접근만 막습니다. 블록체인은 공개 원장이므로, 누구나 노드를 통해 스토리지 값을 직접 읽을 수 있습니다. 즉 비밀번호 같은 민감 정보를 숨기는 용도로 쓰면 안 됩니다.

private 변수와 접근용 함수

public과 달리 private 상태 변수에는 getter 함수가 자동 생성되지 않습니다. 그래서 외부에서 값을 읽게 하려면 아래처럼 public 함수를 직접 만들어 값을 반환해야 합니다. 이렇게 하면 읽기는 허용하되 쓰기는 막는 식으로 접근을 세밀하게 통제할 수 있습니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Bank {
    // private 변수는 getter 가 자동 생성되지 않습니다.
    uint256 private balance = 100;
 
    // 외부에 값을 보여주려면 직접 함수를 만들어야 합니다.
    function getBalance() public view returns (uint256) {
        return balance;
    }
}

private 은 "비밀"이 아니다

이름 때문에 private이 값을 감춰 준다고 오해하기 쉽지만, 실제로 막히는 것은 다른 컨트랙트가 코드에서 그 값을 참조하는 일뿐입니다. 블록체인에 올라간 데이터는 누구나 노드로 조회할 수 있어서, storage 슬롯을 직접 읽으면 private 값도 그대로 드러납니다. 그러니 비밀번호나 개인 키 같은 민감 정보는 절대 컨트랙트에 저장하면 안 됩니다.

private 변수에는 자동 getter 가 없습니다. 외부에서 값을 읽게 하려면 위처럼 별도의 public 함수를 만드세요.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.