변수의 상태

변수의 상태 (Status of Variables)

간단한 일회성 프로그램을 만들 때는 프롬프트에서 어떤 변수들이 있는지 보는 게 아주 편리해요. who 함수와 그 형제들인 whos, whos_line_format이 메모리에 무엇이 있는지에 대한 서로 다른 정보를 보여줘요. 아래 예시처럼요.

출처: 문서

본문

str = "A random string";
who
 -| Variables in the current scope:
 -|
 -| ans  str

who

who
who pattern …
who option pattern …
C = who (…)

주어진 패턴과 일치하는 현재 정의된 변수들의 목록을 보여줘요. 유효한 패턴 문법은 clear 명령에서 설명하는 것과 같아요. 패턴을 주지 않으면 모든 변수를 나열해요. 기본적으로는 로컬 스코프에서 보이는 변수만 표시해요.

다음은 유효한 옵션들이지만, 서로 조합해서 쓸 수는 없어요.

  • global — 현재 스코프가 아니라 전역 스코프의 변수들을 나열해요.
  • -regexp — 표시할 변수를 매칭할 때 패턴을 정규식으로 간주해요. regexp 함수가 받아들이는 것과 같은 패턴 문법을 사용해요.
  • -file — 다음 인자를 파일 이름으로 취급해요. 지정된 파일 안에서 찾은 모든 변수를 나열해요. 파일에서 변수를 읽을 때는 패턴을 받아들이지 않아요.

함수로 호출하면 주어진 패턴과 일치하는 정의된 변수 이름들의 셀 배열을 반환해요.

whos

whos
whos pattern …
whos option pattern …
S = whos ("pattern", …)

주어진 패턴과 일치하는 현재 정의된 변수들에 대한 상세한 정보를 제공해요. 옵션과 패턴 문법은 who 명령과 같아요.

각 변수에 대한 확장 정보는 다음 기본 항목들을 가진 표로 요약돼요.

  • Attr — 나열된 변수의 속성. 가능한 속성은 다음과 같아요.
    • (빈칸) — 로컬 스코프의 변수
    • c — 복소 타입의 변수
    • f — 형식 인자(함수 인자)
    • g — 전역 스코프의 변수
    • p — 영속 변수(persistent variable)
  • Name — 변수의 이름.
  • Size — 변수의 논리 크기. 스칼라는 1x1, 벡터는 1xN 또는 Nx1, 2차원 행렬은 MxN.
  • Bytes — 변수를 저장하는 데 현재 사용 중인 메모리 양.
  • Class — 변수의 클래스. double, single, char, uint16, cell, struct 등이 예시.

표는 whos_line_format 함수를 통해 더 많거나 적은 정보를 보여주도록 사용자 정의할 수 있어요.

whos를 함수로 호출하면 주어진 패턴과 일치하는 정의된 변수 이름들의 구조체 배열을 반환해요. 각 변수를 설명하는 구조체의 필드는 name, size, bytes, class, global, sparse, complex, nesting, persistent예요.

whos_line_format

val = whos_line_format ()
old_val = whos_line_format (new_val)
old_val = whos_line_format (new_val, "local")

whos 명령이 사용하는 형식 문자열을 조회하거나 설정해요.

전체 형식 문자열은 다음과 같아요.

%[modifier]<command>[:width[:left-min[:balance]]]

사용 가능한 명령 시퀀스는 이러해요.

  • %a — 변수의 속성을 출력(c=complex, s=sparse, f=formal parameter, g=global, p=persistent).
  • %b — 변수가 차지하는 바이트 수를 출력.
  • %c — 변수의 클래스 이름을 출력.
  • %e — 변수가 담고 있는 요소 수를 출력.
  • %n — 변수 이름을 출력.
  • %s — 변수의 차원을 출력.
  • %t — 변수의 타입 이름을 출력.

모든 명령에는 정렬 수정자(alignment modifier)도 붙일 수 있어요.

  • l — 왼쪽 정렬.
  • r — 오른쪽 정렬(기본값).
  • c — 열 정렬(%s 명령에만 적용).

width 매개변수는 출력에 사용되는 최소 열 수를 지정하는 양의 정수예요. 필드는 필요에 따라 자동으로 늘어나므로 최댓값은 필요 없어요.

left-minbalance 매개변수는 명령 %s에 열 정렬 수정자를 쓸 때만 사용할 수 있어요. balance는 필드 폭 안에서 각 항목 사이에 정렬되는 열 번호를 지정해요. 번호는 0부터 시작하며 0이 맨 왼쪽 열을 가리켜요. left-min은 지정된 balance 열 왼쪽의 최소 필드 폭을 지정해요.

기본 형식은 다음과 같아요.

"  %la:5; %ln:6; %cs:16:6:1;  %rb:12;  %lc:-1;\n"

함수 안에서 "local" 옵션과 함께 호출하면, 그 함수와 그 함수가 호출하는 서브루틴에 대해서만 변수를 국소적으로 변경해요. 함수에서 빠져나가면 원래 변수 값이 복원돼요.

exist

메모리에 어떤 변수가 있는지 보여주는 대신, 주어진 변수가 있는지 없는지를 판별할 수도 있어요. 이렇게 하면 변수의 존재 여부에 따라 프로그램의 동작을 달리할 수 있어요. 아래 예시가 이걸 보여줘요.

if (! exist ("meaning", "var"))
  disp ("The program has no 'meaning'");
endif
c = exist (name)
c = exist (name, type)

name이 변수, 함수, 파일, 디렉터리, 또는 클래스로 존재하는지 확인해요. 반환 코드 c는 다음 중 하나예요.

  • 1name이 변수.
  • 2name이 절대 파일 이름, Octave의 path에 있는 보통 파일, 또는 (.m을 붙인 뒤) Octave의 path에 있는 함수 파일.
  • 3name이 Octave의 path에 있는 .oct 또는 .mex 파일.
  • 5name이 내장 함수(built-in function).
  • 7name이 디렉터리.
  • 8name이 classdef 클래스.
  • 103name이 파일과 연결되지 않은 함수(명령줄에서 입력된 함수).
  • 0name이 존재하지 않음.

선택 인자 type을 주면 지정한 타입의 심볼만 확인해요. 유효한 타입은 다음과 같아요.

  • "var" — 변수만 확인.
  • "builtin" — 내장 함수만 확인.
  • "dir" — 디렉터리만 확인.
  • "file" — 파일과 디렉터리만 확인.
  • "class" — classdef 클래스만 확인.

타입을 주지 않았는데 name에 대해 여러 가능한 일치가 있다면, exist는 variable, built-in function, oct-file, directory, file, class 순서의 우선순위 목록에 따라 코드를 반환해요.

name이라는 보통 파일이 Octave의 검색 경로에 있으면 exist는 2를 반환해요. 검색 경로에 없는 다른 타입의 파일에 대한 정보는 file_in_pathstat 함수를 조합해 사용하는 게 좋아요.

프로그래밍 참고: name이 버그 있는 .oct/.mex 파일에 의해 구현된다면, exist를 호출할 때 Octave가 충돌할 수 있어요. 높은 성능을 유지하기 위해 Octave는 .oct/.mex 파일을 샌드박스에 넣지 않고 신뢰해요.

clear, clearvars

보통 Octave가 메모리를 관리하지만, 때로는 메모리에서 변수를 직접 지우는 게 실용적일 때가 있어요. 대부분 큰 변수들이 메모리의 상당 부분을 차지할 때 필요하죠. IEEE 754 부동소수점 형식을 쓰는 컴퓨터에서 다음 프로그램은 약 128 MB 메모리를 차지하는 행렬을 할당해요.

large_matrix = zeros (4000, 4000);

이 변수가 메모리에 있으면 다른 계산이 느려질 수 있으므로, 필요하면 메모리에서 직접 제거할 때도 있어요. clear 또는 clearvars 함수가 이 역할을 해요.

clear
clear pattern …
clear options pattern …

주어진 pattern과 이름이 일치하는 것들을 삭제해 메모리를 확보해요. pattern은 다음 특수 문자들을 포함할 수 있어요.

  • ? — 임의의 한 문자와 일치.
  • * — 0개 이상의 문자와 일치.
  • [ list ]list가 지정한 문자 목록과 일치. 첫 문자가 ! 또는 ^이면 list에 지정된 문자를 제외한 모든 문자와 일치. 예를 들어 [a-zA-Z] 패턴은 모든 영문 대소문자와 일치해요. Windows에서는 대괄호가 문자 그대로 매칭되며 문자를 묶는 데 쓰이지 않아요.

예를 들어 명령

clear foo b*r

foo라는 이름과, 문자 'b'로 시작해 'r'로 끝나는 모든 이름을 지워요.

인자 없이 clear를 호출하면 현재 워크스페이스(즉 로컬 변수)의 모든 사용자 정의 변수가 지워져요. 현재 있는 전역 변수들은 현재 워크스페이스에서 더 이상 보이지 않지만, 전역 워크스페이스에는 계속 존재해요. 함수는 이 형태의 clear에 영향을 받지 않아요.

다음은 길고 짧은 형태가 모두 있는 옵션들이에요.

  • all, -all, -a — 모든 로컬·전역 사용자 정의 변수와 심볼 테이블의 모든 함수를 지워요.
  • -exclusive, -x — 뒤따르는 패턴과 일치하지 않는 변수들을 지워요.
  • functions, -functions, -f — 함수 심볼 테이블에서 함수 이름을 지워요. 함수가 mlock으로 메모리에 잠겨 있지 않다면 영속 변수는 기본값으로 다시 초기화돼요.
  • global, -global, -g — 전역 변수 이름을 지워요.
  • variables, -variables, -v — 로컬 변수 이름을 지워요.
  • classes, -classes, -c — 클래스 구조체 테이블과 모든 객체를 지워요.
  • -regexp, -rpattern 인자를 정규식으로 간주하고 일치하는 것들을 지워요.

-exclusive-regexp를 제외한 모든 긴 옵션은 대시 없이도 쓸 수 있어요. -exclusive를 제외하면 다른 옵션은 하나만 나타날 수 있다는 점을 주의하세요. 모든 옵션은 어떤 패턴보다 먼저 나와야 해요.

프로그래밍 참고: clear name 명령은 name이라는 변수와 name이라는 (가려진) 함수가 둘 다 정의되어 있을 때만 변수를 지워요. 예를 들어 foo라는 함수를 정의하고 foo = 2라는 대입으로 그 함수를 숨겼다고 해볼게요. clear foo를 한 번 실행하면 변수 정의가 지워지고 foo가 함수로 복원돼요. clear foo를 두 번째 실행하면 함수 정의가 지워져요.

전역 변수에 연결된 로컬 변수 이름을 지우면 그 변수의 로컬 복사본만 제거돼요. 전역 복사본은 손대지 않으며 global global_varname으로 복원할 수 있어요. 반대로 clear -g global_varname은 로컬 변수와 전역 변수를 둘 다 제거해요.

clearvars
clearvars pattern …
clearvars -regexp pattern …
clearvars … -except pattern …
clearvars … -except -regexp pattern …
clearvars -global …

주어진 pattern과 일치하는 변수들을 메모리에서 삭제해요. patternclear와 같은 특수 문자(?, *, [ list ])를 포함할 수 있어요.

-regexp 옵션을 주면 뒤따르는 패턴을 정규식으로 간주하고 일치하는 것들을 지워요. -except 옵션을 주면 뒤따르는 패턴이 지우지 않을 변수들을 선택해요. -global 옵션을 주면 모든 패턴을 로컬 변수가 아니라 전역 변수에 적용해요. 인자 없이 호출하면 clearvars는 모든 로컬 변수를 삭제해요.

예제 코드:

'x'로 시작하는 모든 변수와 "foobar"라는 특정 변수를 지우려면:

clearvars x* foobar

"foobar" 변수를 지우고, 정규식을 써서 'x''y'로 시작하는 모든 변수를 지우려면:

clearvars foobar -regexp ^x ^y

"foobar"를 제외한 모든 변수를 지우려면:

clearvars -except foobar

"foo"로 시작하는 모든 변수를 지우되 "bar"로 끝나는 것들만 빼려면:

clearvars foo* -except -regexp bar$

pack

pack ()

MATLAB에서 워크스페이스 메모리를 통합해요. 이 함수는 호환성을 위해 제공되지만 Octave에서는 아무것도 하지 않아요.

type, which, what

함수나 변수의 파일 시스템 내 위치 같은 정보도 Octave 안에서 얻을 수 있어요. 이는 보통 프로그램 개발 중에만 유용하고, 프로그램 안에서는 잘 쓰이지 않아요.

type name …
type -q name …
text = type ("name", …)

파일, 함수(m-file), 변수, 연산자, 또는 키워드일 수 있는 name의 내용을 표시해요. type은 보통 name이 함수인지 변수인지 같은 범주를 설명하는 머리말 줄을 앞에 붙이는데, -q 옵션이 이 동작을 끄게 해요.

출력 변수를 쓰지 않으면 내용은 화면에 표시돼요. 그렇지 않으면 문자열들의 셀 배열이 반환되는데, 각 요소는 요청된 각 함수의 내용에 대응해요.

which name …
[str, …] = which ('name', …)

name의 타입을 표시해요. name이 함수 파일에서 정의됐다면 파일의 전체 이름도 함께 표시돼요.

what
what dir
w = what (dir)

디렉터리 dir의 Octave 특정 파일들을 나열해요. dir을 지정하지 않으면 현재 디렉터리를 사용해요. 반환 인자를 요청하면 찾은 파일들이 구조체 w로 반환돼요. 구조체에는 다음 필드들이 있어요.

  • path — 디렉터리 dir의 전체 경로.
  • m — m-파일들의 셀 배열.
  • mat — mat 파일들의 셀 배열.
  • mex — mex 파일들의 셀 배열.
  • oct — oct 파일들의 셀 배열.
  • mdl — mdl 파일들의 셀 배열.
  • slx — slx 파일들의 셀 배열.
  • p — p-파일들의 셀 배열.
  • classes — 클래스 디렉터리(@classname/)들의 셀 배열.
  • packages — 패키지 디렉터리(+pkgname/)들의 셀 배열.

호환성 참고: Octave는 mdl, slx, p 파일을 지원하지 않아요. what은 이 범주들에 대해 항상 빈 목록을 반환해요.

더 알아보기

  • 전역 변수에 대한 내용은 전역 변수 항목을 참고하세요.
  • 영속 변수는 영속 변수 항목에서 다룹니다.