AI/JAVA 프로그래밍 기초

JAVA 프로그래밍 기초 03 Java 기본 문법(2)

Ayel 2025. 10. 11. 17:15

 

 

문자열과 형변환

 

 

1. String 클래스

 

1) 문자열을 표현하고 처리하기 위한 참조 자료형

- 문자열은 String 클래스의 객체

 

2) 문자열 리터럴을 표현할 때 이중따옴표를 사용함

ex1. String s1 = "Java";

ex2. String s2 = new String("Java");.

 

3) String형의 변수는 기본형 변수처럼 사용할 수 있음

 

4) null 이라는 특별한 리터럴이 있음

- 참조형 변수의 값(not available)이 될 수 있음

ex. if (str != null) { ... }

 

 

2. 문자열의 +연산

 

1) 두 문자열을 연결하는 것(concatenation)

- (문자열+기본형) or (문자열+다른 참조형)도 가능

- 기본형과 참조형 값은 문자열로 형변환 가능

 

2) print()나 println()에서 자주 사용됨

System.out.println("result=" + " " + result);
System.out.println('A' + 0);
System.out.println("A" + 0);

 

ex.문자열 덧셈 연산

public class Test {

	public static void main(String args[]) {
		String firstName = "Gildong"; // String 변수는 참조형이지만 기본형처럼 쓸 수 있음
        String lastName = "Hong";
        System.out.println(firstName + lastName);
        System.out.println(firstName.concat(lastName));
    }
}
GildongHong
GildongHong

 

 

3. 자료형의 변환

 

1) 묵시적 형변환

- 작은 타입에서 큰 타입의 값으로는 자동 형변환 가능

- 데이터의 손실 없음

- byte > short > int > long > float > double

- 개발자 > 직원 > 인간 > 포유류

 

- 연산을 수행하거나 메소드에 인자가 전달될 때 자료형 검사가 일어남

- 자료형이 일치하지 않으면 묵시적 형변환 필요

 

2) 자동 형변환의 예

- 대입문: double d=5; // 5는 5.0으로 자동으로 형변환

- 수식: System.out.println("j=" + 10); // 10은 문자열 "10"으로 자동 형변환되어 연결됨

- 함수호출: double res = Math.sqrt(2); // 함수에서 필요한 double 값으로 자동 형변환

 

3) 명시적 형변환

- 큰 타입에서 작은 타입의 값으로 변환할 때는 명시적 형변환이 요구됨(강제 형변환)

- 명시적 형변환을 위한 문법은 (자료형) 피연산자

 

4) 명시적 형변환의 예

- float f = (float)2.14;

float f;
f=2.14;

-> 컴파일 오류 발생(자료형 오류)

- int i; i = (int)3.5; // 3이 대입됨

- double d = (double)3/2;

- short s= 10; s = (short)(s-1);

 

 

변수의 사용

 

 

1. 변수의 종류

 

1) 지역변수

- 메소드 정의 블록{} 또는 임의 블록 안에서 선언된 변수

- 선언된 위치 이후 블록 내부에서만 사용 가능

ex. void getArea(){ double area=0; ... }

 

- 지역변수 <-> 전역변수

* 전역변수: 전 영역에서 사용할 수 있는 변수

** 자바에서는 전역변수는 사실상 없는 것과 같다

 

2) 파라미터

- 메소드 실행에 필요한 인자

ex. int max(int a, int b){ ... }

 

3) 데이터 필드

- 클래스 정의 블록 안에 포함된 데이터 멤버

- 자료형에 따라 0, false, null로 초기값이 자동으로 주어질 수 있음

클래스 변수(static필드) 인스턴스 변수(non-static 필드)
- 객체들이 공유하는 데이터 필드
- 오직 하나만 존재
- static으로 선언된 정적 필드
- 개별 객체가 소유하는 데이터 필드
- 객체의 상태를 표현하기 위한 데이터
- 객체가 생성될 때 만들어짐
class Circle {
	static final double PI = 3.14; // 클래스 변수 - 상수 // 필드
    private int radius; // 인스턴스 변수
    
    public Circle(int a) { // 매서드의 특별한 생성자 // 파라미터
    	this.radius = a;
    }
    
    int getRadius() {
    	return this.radius;
    }
    
    void setRadius(int n) { // 파라미터
    	this.radius = r;
    }
    
    public double getArea() {
    	double temp; // 지역변수
        temp = this.radius * this.radius * PI;
        return temp;
    }
}

 

 

2. 변수 선언 방법

 

1) 변수 선언문

[접근/비접근 제어자] 자료형 변수이름 [=초기값][, 변수이름[=초기값] ... ]; 

- 접근 제어자로 생략, private, protected, public을 사용

- 지역 변수 선언에서는 사용하지 못함

- 비접근 제어자로 static(static data를 선언하기 위해), final(상수 선언)을 사용

 

2) 변수 선언 예시

int option;

double sum=0, difference.product=1;

static final double PI=3.14; // 클래스 변수, 상수

Circle c = new Circle(2);

static int count; // 클래스 변수

protected String name; // 인스턴스 변수

 

 

3. 변수의 사용 범위

 

1) 지역 변수와 파라미터의 사용 범위

- 메소드가 실행될 때 만들어지고 끝나면 없어짐

- 선언된 곳부터 해당 블록이 종료될 때까지 유효함

- 지역 변수는 자동으로 초기값이 주어지지 않음

- 초기값을 지정한 후 사용해야 한다

 

2) 데이터 필드의 사용 범위

- 선언된 클래스 내부에서 사용 가능

- 클래스 외부에서의 사용 여부는 접근 제어자(access modifier)에 따라 다름

ex. class Circle {protected int radius; ...}

 

 

4. 지역 변수와 파라미터의 사용

 

1) 예시1

public class Exam {
	static int sum() { // 파라미터
    	int total = 0; // 지역변수
        for(int i=1; i<=max; i++)
        	total += i;
        return total;
    }
    
    public static void main(String[] args) { // 메인함수 실행
    	int result; // 메인함수에서만 사용되는 지역변수
        result = Exam.sum(10); // exam 클래스의 sum 메소드 실행
        System.out.println(result);
    }
}

 

2) 예시2

class Circle {
	int radius; // 인스턴스 변수
    static int count; // 클래스 변수 // 초기값은 0이 됨
    
    public double getArea() {
    	return this.radius * this.radius * 3.14;
    }
}

public class CircleTest {
	public static void main(String[] args) { // 메인함수에 객체 2개를 만듦
    
    	Circle c1;
        ci = new Circle();
        c1.radius = 3;
        
        Circle c2;
        c2 = new Circle();
        c2.radius = 5;
        
        Circle.count = 2;
    }
}

 

 

입출력

 

 

1. Scanner 클래스

 

1) 키보드나 파일로부터 다양한 자료를 입력받을 때 사용

- 기본적으로 공백으로 구분되는 단어 입력

- 입력 메소드에 따라 단어를 적당한 기본형 또는 문자열로 변환

 

2) 키보드에서 입력받을 때

- 키보드로 타이핑한 후 엔터키를 치면 입력이 이루어짐

Scanner s = new Scanner(System.in); 
// 스캐너 변수 s를 선언하고 
// new Scanner 객체 생성 
// System.in이라는 표준 입력 스트림을 표현하는 객체를 인자로 넣음
String name = s.next();
// next(): 한 단어를 문자열로 해석해 읽어라
// s.next(): 그것을 s에 return
// String name에 그것을 넣어줌

- 엔터키를 치면 String name에 s.next()가 저장됨

 

3) 파일에서 입력받을 때

Scanner s = new Scanner(new File("test.txt"));
String name = s.next();

- 하나의 단어를 문자열로 해석해 입력

 

 

2. Scanner 클래스의 입력용 메소드

 

1) String next()

- 다음 단어를 String 값으로 반환

 

2) int nextInt()

- 다음 단어를 int 값으로 반환

- 형변환이 가능해야 오류가 안 생김

 

3) double nextDouble()

- 다음 단어를 double 값으로 반환

- 형변환이 가능해야 오류가 안 생김

 

4) String nextLine()

- 한 줄을 String 값으로 반환

- 한 라인을 통째로 입력받기 가능

 

5) 예시

public class ScannerTest {
	public static void main(String[] args) {
    	java.util.Scanner s = new java.util.Scanner(System.in);
        // import java.util.Scanner; 구문을 사용해 Scanner 클래스명만으로 사용 가능
        
        System.out.println("정수 2개를 입력하세요.");
    
    	int i = s.nextInt();
        int j = s.nextInt();
        System.out.println("두 수의 합은 " + (i + j) + "입니다");
    }
}
정수 2개를 입력하세요.
51 75
두 수의 합은 126입니다.

 

 

3. 화면 출력과 형식 지정

 

1) 화면 출력을 위한 메소드

- System.out: 문자열 출력을 위한 표준 출력 스트림

 

ex.

- System.out.print()

- System.out.println()

- System.out.printf()

- System.out.format()

 

2) printf(String format, Object... args)

또는 format(String format, Object... args)

- 출력형식 지정

%[인자_인덱스$][+ or -][너비][.소수점이하 자리수]변환문자

 

- 변환 문자: %b(논리값), %h(16진수로 변환해 출력), %s(문자열 출력), %c(문자), %d(10진 정수), %o(8진 정수), %x(16진 정수), %f(실수), %%(%), %n(줄바꿈)

 

3) 예시1

import java.util.*;

public class SimplePrintf {
	public static void main(String[] args) {
    	Scanner s = new Scanner(System.in);
        System.out.println("나이, 몸무게, 키, 혈액형 입력:");
        
        byte age = s.nextByte();
        int weight = s.nextInt();
        double height = s.nextDouble();
        String blood = s.next();
        
        System.out.printf("나이: %d, 몸무게: %d, ", age, weight);
        System.out.printf("키: %f, 혈액형: %s", height, blood);

    }
}
나이, 몸무게, 키, 혈액형 입력:
23 50 165.5 O
나이: 23, 몸무게: 50, 키: 165.500000, 혈액형: B

 

4) 예시2

public class SimpleFormat {
	public static void main(String[] args) {
    	System.out.println("123456 123456 123456");
    	System.out.println("--------------------");
    	System.out.println("%6o %6d %6x %n", 20, 20, 20);
    	System.out.println("%-6o %-6d %-6x %n", 20, 20, 20);
    	System.out.println("%1$6o %+6d %2$6h %n", 128, 256);
    	System.out.println("%1$6.2f %1$6.4f %1$8.6f %n", 3.141592);
    }
}
123456 123456 123456
--------------------
        24         20         14
24         20         14      
      200     +128       100
     3.14  3.1416 3.141592

 

 


 

 

* 자료형 변환: 변수에 값을 대입할 때, 수식을 계싼할 때, 메소드 호출 시 파라미터의 값을 전달할 때 자료형이 일치하지 않는 문제가 발생할 수 있다

-> 이 때 자료형의 변환 필요

 

* 지역 변수: 메소드 정의 블록 안에 선언된 변수

-> 메소드 실행에 필요한 값을 임시 저장하기 위한 것으로 메소드 실행이 종료되면 사라짐

 

* 인스턴스 변수: 클래스 정의에 포함되는 필드의 종류

-> 객체가 생성될 때 만들어져 해당 객체의 상태값을 저장하기 위해 사용

 

* 클래스 변수: 클래스 정의에 포함되는 필드의 종류

-> 해당 클래스의 모든 객체들이 공유하는 변수

 

* Scanner 클래스: 기본형 데이터와 문자열의 입력 기능을 제공하는 유틸리티 클래스

-> 공백문자로 구분되는 단어(토큰) 단위로 입력받는다