[Java] 스코프, Scanner, 배열, 메서드

2025. 5. 5.·Language/Java
반응형


✅ 스코프 (Scope)

🔹존재 이유

1. 효율적인 메모리 사용

조건문이나 반복문 코드 블럭 안의 지역변수가 있다면 블록의 종료 시점에 이 변수를 메모리에서 제거해서 더 효율적으로 메모리를 사용하고 유지보수하기 좋은 코드를 만들 수 있다.

 

2. 코드의 복잡성을 감소

실무에서 코드는 매우 복잡한 경우가 많기 때문에 단순한 코드를 지향하는 것이 좋다. 따라서 사용을 다한 필요없는 변수가 있다면 메모리에서 제거해서 줄인다면 생각해야할 변수가 간단해진다.

 

좋은 프로그램은 무한한 자유가 있는 프로그램이 아니라 적절한 제약이 있는 프로그램이다.

 

🔹형변환(Casting, 캐스팅)

1. 자동 형변환 (묵시적 형변환)

작은 범위에서 큰 범위로 값을 당연히 넣을 수 있다.

    • ex) int < long < double

큰 범위에서 작은 범위는 소수점 버림, 오버플로우 같은 문제가 발생할 수 있다.

int intValue = 10
double doubleValue = intValue
doubleValue = (double) intValue // 형 맞추기
doubleValue = (double) 10 // 변수 값 읽기
doubleValue = 10.0 // 형변환

작은 범위 숫자 타입에서 큰 범위 숫자 타입으로의 대입은 직접 형변환하지 않아도 위 코드와 같이 개념적으로는 다음과 같이 동작한다.

 

2. 명시적 형변환

큰 범위에서 작은 범위 대입은 명시적 형변환이 필요하다.

double에서 int로 대입하는 경우에는 intValue = (int) doubleValue; 와 같이 명시적 형변환을 해주어야한다. 이때 double의 소수점은 int형으로 변환되면서 숫자가 손실된다.

 

🔹형변환과 오버플로우 (Overflow)

기존 범위를 초과하게 되면 시계 한바퀴 도는 것처럼 처음부터 시작하게 되며 이런 현상을 오버플로우(Overflow)라 한다.

오버플로우가 발생하면 타입을 바꿔서 해결할 문제이지 계산해서 활용하지 않도록 해야한다.

 

🔹형변환과 계산

자바에서 형변환과 관련된 계산은 2가지를 기억하면 된다.

 

  1. 같은 타입끼리의 계산은 같은 타입의 결과를 낸다.
    • int + int는 int를, double + double은 double의 결과를 낸다.
  2. 서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.
    • int + long은 long + long으로 자동 형변환이 일어난다.
    • int + double은 double + double로 자동 형변환이 일어난다.
double div1 = (double) 3 / 2; // 명시적 형변환 사용
double div1 = (double) 3 / (double) 2; // double / int이므로, double / double로 형변환이 발생한다.
double div1 = 3.0 / 2.0; // double / double -> double이 된다.
double div1 = 1.5;

int형끼리 나눗셈해서 소수까지 구하고 싶다면 위 코드와 같이 한쪽을 명시적 형변환을 사용해주면 자동 형변환을 나머지에도 해주어 결과값도 double로 소수점까지 계산한 값이 나오게 된다. 

 

타입 확인을 위해서는 다음과 같이 쓰면 된다.

double div1 = (double) 3 / 2;
System.out.println("div1 = " + div1);
System.out.println(((Object) div1).getClass().getName()); // 타입확인

/* 출력 
div1 = 1.5
java.lang.Double
*/

 


✅ Scanner

System.out을 통해서는 출력을 할 수 있지만 System.in을 통해서는 사용자 입력을 받을 수 있다.

import java.util.Scanner; 코드를 추가하고

Scanner scanner = new Scanner(System.in); 코드를 통해 Scanner 클래스 제공을 사용할 수 있다.

  • scanner.nextLine(); 엔터(\n)을 입력할 때까지 문자열을 입력 받는다.
  • scanner.nextInt(); 정수를 입력받는다.
  • scanner.nextDouble(); 실수를 입력받는다.

⚠️ 주의사항❗

import java.util.Scanner;

public class ScannerTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int intValue = scanner.nextInt();
        scanner.nextLine(); // 숫자 입력 후 입력된 개행문자 제거 처리
        String stringValue = scanner.nextLine();
        System.out.println("intValue = " + intValue);
        System.out.println("stringValue = " + stringValue);
    }
}

 위 코드와 같이 정수나 실수를 입력받은 후에 문자를 입력받는다면 이전에 입력받은 개행문자(\n)에 대해 제거 처리를 해주어야한다. 제거 처리를 해주지 않는다면 문자를 입력받는 곳에 개행문자가 입력되어 사용자로부터 입력을 받지 않게 된다. 다만, 정수나 실수를 입력받은 후에 정수나 실수를 입력받는다면 제거 처리를 해주지 않아도 된다.

 


✅ 배열

배열은 같은 타입의 변수를 반복해서 선언하고 사용하는 문제를 해결하기 위해 사용한다.

// 방법1 0으로 자동 초기화
int[] students;
students = new int[5];

// 방법2 0으로 자동 초기화
int[] students1 = new int[5];

// 방법3 사용자 초기화
int[] students2 = new int[]{1, 2, 3, 4, 5};

// 방법4 간편 사용자 초기화
int[] students3 = {1, 2, 3, 4, 5};

// 이 방법은 잘못된 방법이다. 오류가 발생한다.
int[] students4;
students4 = {1, 2, 3, 4, 5};

선언과 생성, 초기화 방법은 위 코드와 같다. (잘못된 방법에 주의하자❗)

배열을 사용자가 초기화하지 않는다면 자바는 자동으로 그 내부값을 초기화한다.

숫자는 0, boolean은  false, String은 null로 자동 초기화한다.

 

위의 students, students1, students2, students3 변수에는 배열의 참조값(주소)을 보관한다.

인덱스(index)로 배열의 요소에 접근한다. 인덱스는 0부터 시작한다.

인덱스 허용 범위를 넘어서면 오류가 발생한다. 

 

배열이 참조형을 사용하는 이유는 동적으로 사이즈를 변경할 수 있도록 하기 위해서이다.

int size=10000; //사용자가 입력한 값을 넣었다고 가정해보자.
new int[size]; //이 코드가 실행되는 시점에 배열의 크기가 정해진다.

student.length 를 사용하여 배열의 길이를 제공받을 수 있다. 

조회만 가능하며 대입은 불가능하다.

배열의 크기가 5라면 5를 반환한다.

 

2차원 배열은 int[][] arr = new int[2][3]와 같이 선언하고 생성한다.

행(row) 번호를 먼저 찾고, 그 다음 열(column) 번호를 찾는다.

arr[행, row][열, column] 이다.

int[][] arr = {
        {1, 2, 3},
        {4, 5, 6}
};

초기화는 위와 같은 방식으로 보기 쉽도록 표현한다.

 


✅ 메서드 (Method)

자바에서 함수를 메서드(Method)라 한다. 

메서드도 함수의 한 종료이다.

public static int add(int a, int b) {
    System.out.println(a + "+" + b + " 연산 수행");
    int sum = a + b;
    return sum;
}

메서드 선언에는 접근제어자, 반환타입, 메서드 이름, 매개변수(파라미터) 순으로 적는다.

메서드 본문에는 메서드가 수행해야할 코드를 적는다.

 

인수(Argument)

메서드를 호출할 때 메서드에 넘기는 값을 말한다.

매개변수의 타입과 순서가 맞아야한다.

인자라고 부르기도 한다.

 

매개변수(Parameter)

메서드를 정의할 때 선언한 변수이다. 

메서드를 호출할 때 인수를 넘기면, 그 인수가 매개변수에 할당된다.

매개변수, 파라미터로 보통 부른다.

 

모든 메서드는 항상 return을 호출해야한다.

반환 타입이 void인 경우에는 생략해도 되지만 이는 자바가 자동으로 return;을 마지막 줄에 넣어준다.

메서드 안에서 조건문으로 분기하는 경우 return문을 적어주면 그 즉시 해당 메서드를 빠져나갈 수 있다.

 

⭐ 자바는 항상 변수의 값을 복사해서 대입한다❗

 

메서드와 형변환

메서드를 호출할 때 인자와 매개변수의 타입이 맞지 않다면 명시적 형변환과 자동 형변환을 사용하여주어야 한다.

 

🔹메서드 오버로딩 (Overloading)

메서드의 이름이 같고 매개변수가 다른 메서드를 여러개 정의하는 것을 메서드 오버로딩(Overloading)이라 한다.

메서드 시그니처 (Method signature)는 자바에서 메서드가 같은 것인지 다른 것인지 구분하는 기준, 고유한 식별자나 서명을 의미한다. 메서드 이름과 매개변수 리스트의 조합으로 구성된다.

 

오버로딩 규칙

  • 메서드의 이름이 같아도 매개변수의 타입이나 순서가 다르면 오버로딩이 가능하다.
  • 반환 타입은 인정하지 않는다.
  • 본인 타입에 최대한 맞는 메서드를 찾아서 실행하고, 없다면 형변환이 가능한 타입의 메서드를 찾아서 실행한다.

 

🔹 메서드 사용의 장점

  1. 코드 재사용
    • 메서드는 특정 기능을 캡슐화하므로, 필요할 때마다 그 기능을 다시 작성할 필요없이 메서드를 호출함으로써 코드를 재사용 가능하다.
  2. 코드의 가독성
    • 메서드 이름을 통해 코드가 수행하는 작업을 명확하게 나타내어서 코드를 읽는 사람이 파악하기 쉽게 추가적인 문맥을 제공한다.
  3. 모듈성
    • 큰 프로그램을 작은, 관리 가능한 부분으로 나눌 수 있다.
  4. 코드 유지 관리
    • 코드 특정 부분에서 문제가 발생하거나 업데이트가 필요한 경우 해당 메서드만 수정하면 된다.
  5. 재사용성과 확장성
    • 잘 설계된 메서드는 다른 프로그램이나 프로젝트에서도 재사용이 가능하며, 새로운 기능을 추가하거나 기존 기능을 확장하는데 유용하다.
  6. 추상화
    • 메서드를 호출, 사용하는 곳에서는 메서드의 구현을 몰라도 된다. 사용법만 알면 된다.
  7. 테스트와 디버깅 용이성
    • 개별 메서드는 독립적으로 테스트하고 디버그할 수 있다. 코드의 문제를 신속하게 찾고 수정하는데 편하다.
💡참고: 변수명을 일반적으로 명사를 사용하고, 메서드명은 일반적으로 동사로 시작한다.

 


📌 위 내용은 김영한의 자바 입문 강의를 듣고 공부 내용을 정리한 것입니다.
자세한 내용은 강의를 구매하여 보도록 합시다.
 

[지금 무료]김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음 강의 | 김영한 - 인프런

김영한 | , 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 자바 입문[사진][임베딩 영상]단순히 자바 문법을 안다? 이걸로는 안됩니다!전 우아한형제들 기술이사, 누적 수강생 40만 명 돌

www.inflearn.com

반응형
저작자표시 비영리 동일조건 (새창열림)

'Language > Java' 카테고리의 다른 글

[Java] 상속  (0) 2025.05.12
[Java] 패키지, 접근 제어자, 자바 메모리 구조, static, final  (0) 2025.05.09
[Java] 클래스, 생성자, OOP  (0) 2025.05.08
[Java] 변수, 연산자, 조건문, 반복문  (0) 2025.05.01
[Java] 자바, 표준 스펙, 컴파일, IDE  (0) 2025.04.30
'Language/Java' 카테고리의 다른 글
  • [Java] 패키지, 접근 제어자, 자바 메모리 구조, static, final
  • [Java] 클래스, 생성자, OOP
  • [Java] 변수, 연산자, 조건문, 반복문
  • [Java] 자바, 표준 스펙, 컴파일, IDE
sunghyun.dev
sunghyun.dev
개발 공부를 기록하는 블로그입니다.
  • sunghyun.dev
    개발 공부 기록 블로그
    sunghyun.dev
  • 전체
    오늘
    어제
    • 전체 글 (61)
      • Problem Solving (Java) (51)
        • 백준 (51)
        • 프로그래머스 (0)
      • Computer Science (2)
        • 자료구조 (0)
        • 알고리즘 (2)
        • 컴퓨터 구조 (0)
        • 운영체제 (0)
        • 컴퓨터 네트워크 (0)
      • Language (7)
        • Java (7)
        • Kotlin (0)
        • Python (0)
      • Framework (0)
        • Spring (0)
        • Node.js (0)
        • Vue.js (0)
        • React (0)
      • DBMS (0)
        • 데이터베이스 (0)
        • MySQL (0)
        • Oracle (0)
        • MariaDB (0)
      • Git (0)
      • Web (0)
      • Cloud (0)
      • 자격증 (0)
        • SQLD (0)
        • 정보처리기사 (0)
        • 오픽 (0)
        • AICE (0)
      • Toy Project (0)
      • IDE (0)
        • IntelliJ IDEA (0)
      • 기타 (0)
      • Tistory (1)
  • 링크

    • Github
    • Notion
  • 블로그 메뉴

    • 홈
    • 방명록
    • 태그
  • 인기 글

  • 태그

    브루트포스
    최대공약수
    알고리즘
    스택
    재귀함수
    문자열
    Deque
    배열
    백준
    조합
    HashMap
    카운팅정렬
    Comparator
    LCM
    코딩테스트
    덱
    gcd
    Java
    이진탐색
    유클리드호제법
  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
sunghyun.dev
[Java] 스코프, Scanner, 배열, 메서드
상단으로

티스토리툴바