변수와 제어 흐름
프로그램은 값을 보관하고, 계산하고, 조건에 따라 다음 동작을 결정합니다. 이 장에서는 변수 하나에서 시작해 반복과 메서드로 코드를 확장합니다. 소스 파일·package·import와 타입 규칙은 프로그램 구조와 타입에서 먼저 확인할 수 있습니다. 각 코드의 빌드·실행은 실제 서버에 요청하며, 결과가 비교 기준과 다른 경우 그대로 표시합니다.
타입과 변수
섹션 제목: “타입과 변수”변수는 타입 이름 = 초기값;으로 선언합니다. int와 long은 정수, double은 소수, bool은 참·거짓, string은 문자열을 표현합니다. 문자열에는 큰따옴표를 씁니다.
class PrimitiveTypes {
static void main() {
int count = 3;
long sequence = 1001;
double ratio = 0.5;
bool enabled = true;
string label = "Unibase";
print(label);
print(count);
print(sequence);
print(ratio);
print(enabled);
}
}public class PrimitiveTypes {
public static void main(String[] args) throws Exception {
int count = 3;
long sequence = 1001L;
double ratio = 0.5;
boolean enabled = true;
String label = "Unibase";
System.out.println(label);
System.out.println(count);
System.out.println(sequence);
System.out.println(ratio);
System.out.println(enabled);
}
}count: int = 3
sequence: int = 1001
ratio: float = 0.5
enabled: bool = True
label: str = "Unibase"
print(label)
print(count)
print(sequence)
print(ratio)
print(str(enabled).lower())Python의 int는 크기가 가변이며 Unibase의 int·long 구분과 다릅니다.
using System;
class PrimitiveTypes {
static void Main() {
int count = 3;
long sequence = 1001L;
double ratio = 0.5;
bool enabled = true;
string label = "Unibase";
Console.WriteLine(label);
Console.WriteLine(count);
Console.WriteLine(sequence);
Console.WriteLine(ratio.ToString(System.Globalization.CultureInfo.InvariantCulture));
Console.WriteLine(enabled.ToString().ToLowerInvariant());
}
}const count: number = 3;
const sequence: bigint = 1001n;
const ratio: number = 0.5;
const enabled: boolean = true;
const label: string = "Unibase";
console.log(label);
console.log(count);
console.log(String(sequence));
console.log(ratio);
console.log(enabled);TypeScript의 number는 정수와 실수를 함께 표현합니다. 큰 정수에는 bigint를 사용합니다.
package main
import (
"fmt"
)
func main() {
count := 3
var sequence int64 = 1001
ratio := 0.5
enabled := true
label := "Unibase"
fmt.Println(label)
fmt.Println(count)
fmt.Println(sequence)
fmt.Println(ratio)
fmt.Println(enabled)
}다른 언어의 탭은 직접 작성한 대응 코드이며 컴파일러의 자동 생성 결과가 아닙니다. 언어마다 API와 실행 환경이 다릅니다. 이 페이지의 빌드·실행은 Unibase 탭에서 사용할 수 있습니다.
Unibase 실행 결과
빌드·실행 메시지
출력 비교 기준
Unibase
3
1001
0.5
true
검증 상태: 문법 검사 통과 · 실행 출력 일치 (2026-10-06)
읽기 기준 결과와 실제 실행 출력 비교
코드를 읽어 정한 비교 기준입니다. 실행 성공 결과로 대신 표시하지 않습니다.
Unibase
3
1001
0.5
true실제 네이티브 실행: 빌드 passed, 실행 passed, 종료 코드 0
Unibase
3
1001
0.5
true현재 실행 확인 범위count는 개수, ratio는 비율처럼 값의 성격에 맞는 타입을 고릅니다. bool 값은 조건식에도 사용할 수 있습니다. 같은 이름에 다른 타입의 값을 넣는 코드가 허용된다고 가정하지 마세요.
연산과 대입
섹션 제목: “연산과 대입”=는 오른쪽 결과를 왼쪽 변수에 저장합니다. value = value + 10에서는 기존 값 7을 읽어 10을 더한 뒤 17로 바꿉니다. %는 나머지를 구하므로 17 % 6은 5입니다.
class Variables {
static void main() {
int value = 7;
value = value + 10;
int remainder = value % 6;
print(value);
print(remainder);
}
}public class Variables {
public static void main(String[] args) throws Exception {
int value = 7;
value = value + 10;
int remainder = value % 6;
System.out.println(value);
System.out.println(remainder);
}
}value = 7
value = value + 10
remainder = value % 6
print(value)
print(remainder)using System;
class Variables {
static void Main() {
int value = 7;
value = value + 10;
int remainder = value % 6;
Console.WriteLine(value);
Console.WriteLine(remainder);
}
}let value = 7;
value = value + 10;
const remainder = value % 6;
console.log(value);
console.log(remainder);package main
import (
"fmt"
)
func main() {
value := 7
value = value + 10
remainder := value % 6
fmt.Println(value)
fmt.Println(remainder)
}다른 언어의 탭은 직접 작성한 대응 코드이며 컴파일러의 자동 생성 결과가 아닙니다. 언어마다 API와 실행 환경이 다릅니다. 이 페이지의 빌드·실행은 Unibase 탭에서 사용할 수 있습니다.
Unibase 실행 결과
빌드·실행 메시지
출력 비교 기준
17
5
검증 상태: 문법 검사 통과 · 실행 출력 일치 (2026-10-06)
읽기 기준 결과와 실제 실행 출력 비교
코드를 읽어 정한 비교 기준입니다. 실행 성공 결과로 대신 표시하지 않습니다.
17
5실제 네이티브 실행: 빌드 passed, 실행 passed, 종료 코드 0
17
5현재 실행 확인 범위| 표현 | 의미 |
|---|---|
a + b, a - b, a * b |
덧셈, 뺄셈, 곱셈 |
a / b, a % b |
나눗셈, 나머지 |
a > b, a <= b, a == b |
비교하여 조건 만들기 |
초기화와 이후의 대입을 나누어 읽으면 어느 시점에 값이 바뀌는지 파악하기 쉽습니다.
괄호와 평가 순서 읽기
섹션 제목: “괄호와 평가 순서 읽기”a + b * c와 (a + b) * c는 계산 구조가 다릅니다. 복합 계산에서는 먼저 묶어 계산할 부분을 괄호로 드러내세요. 코드의 의도가 우선순위 암기에 의존하지 않도록 중간 결과에 이름을 붙일 수도 있습니다.
대입 =와 같음 비교 ==도 구분합니다. value = 7은 저장하는 문장이고 value == 7은 조건을 만드는 표현식입니다. 비교식의 값을 받는 변수에는 bool을 사용합니다.
조건에 따른 분기
섹션 제목: “조건에 따른 분기”if (조건)의 조건이 참이면 첫 블록을, 거짓이면 else 블록을 선택하는 구조입니다. 아래 코드는 숫자가 양수인지 비교해 sign에 결과를 저장합니다.
class Condition {
static void main() {
int number = 7;
int sign = 0;
if (number > 0) {
sign = 1;
} else {
sign = -1;
}
print(sign);
}
}public class Condition {
public static void main(String[] args) throws Exception {
int number = 7;
int sign = 0;
if (number > 0) { sign = 1; } else { sign = -1; }
System.out.println(sign);
}
}number = 7
sign = 0
if number > 0:
sign = 1
else:
sign = -1
print(sign)using System;
class Condition {
static void Main() {
int number = 7;
int sign = 0;
if (number > 0) { sign = 1; } else { sign = -1; }
Console.WriteLine(sign);
}
}const number = 7;
let sign = 0;
if (number > 0) { sign = 1; } else { sign = -1; }
console.log(sign);package main
import (
"fmt"
)
func main() {
number := 7
sign := 0
if number > 0 {
sign = 1
} else {
sign = -1
}
fmt.Println(sign)
}다른 언어의 탭은 직접 작성한 대응 코드이며 컴파일러의 자동 생성 결과가 아닙니다. 언어마다 API와 실행 환경이 다릅니다. 이 페이지의 빌드·실행은 Unibase 탭에서 사용할 수 있습니다.
Unibase 실행 결과
빌드·실행 메시지
출력 비교 기준
1
검증 상태: 문법 검사 통과 · 실행 출력 일치 (2026-10-06)
읽기 기준 결과와 실제 실행 출력 비교
코드를 읽어 정한 비교 기준입니다. 실행 성공 결과로 대신 표시하지 않습니다.
1실제 네이티브 실행: 빌드 passed, 실행 passed, 종료 코드 0
1현재 실행 확인 범위number가 7일 때 읽기 기준 결과는 1입니다. number를 -7로 바꾸었을 때 -1이 나오는지도 확인해야 분기가 동작한다고 말할 수 있습니다. 두 블록의 문자열을 모두 출력한 결과는 분기 성공이 아닙니다.
조건을 여러 단계로 나누기
섹션 제목: “조건을 여러 단계로 나누기”else if는 앞 조건이 선택되지 않았을 때 다음 조건을 확인하는 구조입니다. 서로 배타적인 분류에는 연결된 분기를, 독립적인 두 검사는 별도의 if 두 개를 사용합니다. 0도 구분하려면 양수·음수·0의 세 경우를 명시해야 합니다. 현재 예제의 else는 0을 포함한 양수 이외의 경우입니다.
논리 결합에는 &&, ||, !를 사용합니다. null 허용 bool 값의 연산은 일반 bool과 구분하며, 단락 평가가 필요한 호출은 해당 런타임에서 별도로 검증해야 합니다.
for: 범위를 정한 반복
섹션 제목: “for: 범위를 정한 반복”for (초기화; 조건; 갱신)은 횟수나 범위를 알고 있을 때 사용합니다. i가 1에서 5까지 바뀌는 동안 total에 값을 누적하고, 루프가 끝난 뒤 합계를 읽습니다.
class ForSum {
static void main() {
int total = 0;
for (int i = 1; i <= 5; i = i + 1) {
total = total + i;
}
print(total);
}
}public class ForSum {
public static void main(String[] args) throws Exception {
int total = 0;
for (int i = 1; i <= 5; i = i + 1) {
total = total + i;
}
System.out.println(total);
}
}total = 0
for i in range(1, 6):
total = total + i
print(total)using System;
class ForSum {
static void Main() {
int total = 0;
for (int i = 1; i <= 5; i = i + 1) {
total = total + i;
}
Console.WriteLine(total);
}
}let total = 0;
for (let i = 1; i <= 5; i = i + 1) {
total = total + i;
}
console.log(total);package main
import (
"fmt"
)
func main() {
total := 0
for i := 1; i <= 5; i = i + 1 {
total = total + i
}
fmt.Println(total)
}다른 언어의 탭은 직접 작성한 대응 코드이며 컴파일러의 자동 생성 결과가 아닙니다. 언어마다 API와 실행 환경이 다릅니다. 이 페이지의 빌드·실행은 Unibase 탭에서 사용할 수 있습니다.
Unibase 실행 결과
빌드·실행 메시지
출력 비교 기준
15
검증 상태: 문법 검사 통과 · 실행 출력 일치 (2026-10-06)
읽기 기준 결과와 실제 실행 출력 비교
코드를 읽어 정한 비교 기준입니다. 실행 성공 결과로 대신 표시하지 않습니다.
15실제 네이티브 실행: 빌드 passed, 실행 passed, 종료 코드 0
15현재 실행 확인 범위본문을 따라가면 합계는 1 → 3 → 6 → 10 → 15가 됩니다. 루프 밖의 total은 반복 사이의 값을 보관하고, 루프 안의 i는 현재 항목을 가리킵니다. List 순회에서는 고정 숫자 대신 size()를 반복 조건으로 사용합니다.
반복 경계 정하기
섹션 제목: “반복 경계 정하기”인덱스는 0부터 시작하고 크기가 n이면 마지막 인덱스는 n - 1입니다. 따라서 목록 순회 조건에는 보통 i < size()를 사용합니다. i <= size()는 크기와 같은 인덱스까지 읽어 범위를 벗어날 수 있습니다.
숫자 1부터 5까지 더하는 이 예제는 i <= 5가 마지막 값을 포함하는 조건입니다. 두 경우를 같은 경계로 생각하지 마세요. 빈 목록·항목 하나·여러 항목을 나눠 읽어 보면 반복 조건의 의미가 드러납니다.
while: 조건이 유지되는 반복
섹션 제목: “while: 조건이 유지되는 반복”while (조건)은 본문을 실행하기 전에 조건을 확인하는 구조입니다. 카운트다운에서는 remaining > 0인 동안 현재 값을 사용하고 1씩 줄입니다.
class Countdown {
static void main() {
int remaining = 3;
while (remaining > 0) {
print(remaining);
remaining = remaining - 1;
}
}
}public class WhileLoop {
public static void main(String[] args) throws Exception {
int remaining = 3;
while (remaining > 0) {
System.out.println(remaining);
remaining = remaining - 1;
}
}
}remaining = 3
while remaining > 0:
print(remaining)
remaining = remaining - 1using System;
class WhileLoop {
static void Main() {
int remaining = 3;
while (remaining > 0) {
Console.WriteLine(remaining);
remaining = remaining - 1;
}
}
}let remaining = 3;
while (remaining > 0) {
console.log(remaining);
remaining = remaining - 1;
}package main
import (
"fmt"
)
func main() {
remaining := 3
for remaining > 0 {
fmt.Println(remaining)
remaining = remaining - 1
}
}다른 언어의 탭은 직접 작성한 대응 코드이며 컴파일러의 자동 생성 결과가 아닙니다. 언어마다 API와 실행 환경이 다릅니다. 이 페이지의 빌드·실행은 Unibase 탭에서 사용할 수 있습니다.
Unibase 실행 결과
빌드·실행 메시지
출력 비교 기준
3
2
1
검증 상태: 문법 검사 통과 · 실행 출력 일치 (2026-10-06)
읽기 기준 결과와 실제 실행 출력 비교
코드를 읽어 정한 비교 기준입니다. 실행 성공 결과로 대신 표시하지 않습니다.
3
2
1실제 네이티브 실행: 빌드 passed, 실행 passed, 종료 코드 0
3
2
1현재 실행 확인 범위읽기 기준 출력 순서는 3, 2, 1입니다. 조건에 사용하는 값을 갱신하지 않으면 반복이 끝나지 않을 수 있으므로, 종료 조건과 값 갱신을 함께 읽으세요.
| 반복 구조 | 선택 기준 |
|---|---|
for (초기화; 조건; 갱신) |
인덱스·횟수·범위를 함께 표현 |
while (조건) |
실행 전 조건을 검사하는 반복 |
언어 명세의 do while, for (... in ...), break, continue는 현재 실행 경로에서 검증한 전체 소스에 포함하지 않았습니다. 사용 가능한 것처럼 Java의 문법이나 실행 결과를 대신 적용하지 않습니다.
메서드: 이름을 붙인 계산
섹션 제목: “메서드: 이름을 붙인 계산”반복해서 쓰는 계산은 메서드로 묶습니다. static int square(int value)는 정수 하나를 받아 정수 하나를 반환합니다. return 뒤의 값이 호출한 곳으로 전달됩니다.
class Methods {
static int square(int value) {
return value * value;
}
static void main() {
int result = square(5);
print(result);
}
}public class Methods {
static int square(int value) { return value * value; }
public static void main(String[] args) {
int result = square(5);
System.out.println(result);
}
}def square(value: int) -> int:
return value * value
result = square(5)
print(result)using System;
class Methods {
static int Square(int value) { return value * value; }
static void Main() {
int result = Square(5);
Console.WriteLine(result);
}
}function square(value: number): number { return value * value; }
const result = square(5);
console.log(result);package main
import (
"fmt"
)
func square(value int) int { return value * value }
func main() {
result := square(5)
fmt.Println(result)
}다른 언어의 탭은 직접 작성한 대응 코드이며 컴파일러의 자동 생성 결과가 아닙니다. 언어마다 API와 실행 환경이 다릅니다. 이 페이지의 빌드·실행은 Unibase 탭에서 사용할 수 있습니다.
Unibase 실행 결과
빌드·실행 메시지
출력 비교 기준
25
검증 상태: 문법 검사 통과 · 실행 출력 일치 (2026-10-06)
읽기 기준 결과와 실제 실행 출력 비교
코드를 읽어 정한 비교 기준입니다. 실행 성공 결과로 대신 표시하지 않습니다.
25실제 네이티브 실행: 빌드 passed, 실행 passed, 종료 코드 0
25현재 실행 확인 범위호출부는 square(5)가 어떤 방식으로 계산하는지 몰라도 반환값을 사용할 수 있습니다. 매개변수 5와 반환값 25를 연결해 확인하면 메서드 호출과 계산을 함께 검증할 수 있습니다. 객체의 값을 사용하는 메서드는 클래스와 객체에서 다룹니다.
반환값과 부수 효과
섹션 제목: “반환값과 부수 효과”계산 결과를 돌려주는 메서드는 호출부가 그 값을 저장·다른 계산·출력에 사용할 수 있습니다. void 메서드는 반환값 없이 객체 상태를 바꾸거나 출력하는 동작을 표현합니다. return;과 return value;의 차이를 반환 타입과 함께 읽으세요.
같은 계산을 메서드로 옮기더라도 사용하는 타입·입력값·반환값의 의미가 바뀌지는 않아야 합니다. 값을 반환하는 메서드의 종료 경로에 반환값이 없으면 현재 의미 검사가 거절합니다. 오류를 찾는 순서는 오류와 예외에서 설명합니다.
문자열과 var
섹션 제목: “문자열과 var”var는 초기값에서 변수 타입을 추론하는 선언입니다. 여기서는 name의 초기값이 문자열이며, 문자열 연결로 새 메시지를 만듭니다.
class StringConcat {
static void main() {
var name = "Unibase";
string message = "Hello, " + name;
print(message);
}
}public class StringConcat {
public static void main(String[] args) throws Exception {
var name = "Unibase";
String message = "Hello, " + name;
System.out.println(message);
}
}name = "Unibase"
message = "Hello, " + name
print(message)using System;
class StringConcat {
static void Main() {
var name = "Unibase";
string message = "Hello, " + name;
Console.WriteLine(message);
}
}const name = "Unibase";
const message = "Hello, " + name;
console.log(message);package main
import (
"fmt"
)
func main() {
name := "Unibase"
message := "Hello, " + name
fmt.Println(message)
}다른 언어의 탭은 직접 작성한 대응 코드이며 컴파일러의 자동 생성 결과가 아닙니다. 언어마다 API와 실행 환경이 다릅니다. 이 페이지의 빌드·실행은 Unibase 탭에서 사용할 수 있습니다.
Unibase 실행 결과
빌드·실행 메시지
출력 비교 기준
Hello, Unibase
검증 상태: 문법 검사 통과 · 실행 출력 일치 (2026-10-06)
읽기 기준 결과와 실제 실행 출력 비교
코드를 읽어 정한 비교 기준입니다. 실행 성공 결과로 대신 표시하지 않습니다.
Hello, Unibase실제 네이티브 실행: 빌드 passed, 실행 passed, 종료 코드 0
Hello, Unibase현재 실행 확인 범위문자열 자체의 줄바꿈·따옴표·역슬래시는 문자열과 이스케이프에서 실제 서버 출력과 비교할 수 있습니다. 이 장의 타입·계산·제어 흐름·호출은 실제 native 결과 비교를 통과했습니다. 소스 아래의 검증 기록과 빌드·실행 결과를 함께 확인하세요. 자세한 환경과 지원 범위는 현재 실행 확인 범위를 참고하세요.