6. 스코프(scope)

스코프는 변수의 생존 범위를 의미한다.

 

종류

  • 지역 변수 : 특정 지역에서만 사용할 수 있는 변수
  • 멤버 변수 : 클래스 변수, 인스턴스 변수

 

스코프 존재 이유

  • 비효율적인 메모리 사용 예방
    • 모든 변수가 모든 지역에서 사용이 가능하다면 특정 지역에서만 사용되는 변수로 인해 메모리 낭비가 계속 발생할 가능성 존재
  • 코드 복잡성 증가 예방
    • 전역 변수는 개발자가 계속 신경을 써야하고, 에러의 위험성이 있어서 코드를 복잡하게 만든다.
    • 필요할 때만 딱 쓰고 신경 안쓰게 변수의 범위를 잘 정하자
    • 좋은 코드는 단순하고, 명확한 코드!!

 

정리

  • 변수의 스코프는 꼭 필요한 곳으로 한정해서 사용하자.
    • 메모리를 효율적으로 사용하고 더 유지보수하기 좋은 코드를 만들 수 있다.
  • 좋은 프로그램은 무한한 자유가 있는 프로그램이 아니라 적절한 제약이 있는 프로그램이다.
    • 제약의 끝판왕은 타입 제한 → 유지보수에 유용하다

 

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

작은 범위의 타입 값을 큰 범위 타입에 자동으로 넣을 수 있다. 하지만 반대는 소수점 버림, 오버플로우와 같은 문제가 발생할 수 있기에 주의해야 한다.

  • 가능한 케이스
    • int → long → double 가능
    package casting;
    public class Casting1 {
    	public static void main(String[] args) {
    		int intValue = 10;
    		long longValue;
    		double doubleValue;
    
    		longValue = intValue; // int -> long
    		System.out.println("longValue = " + longValue); //longValue = 10
    
    		doubleValue = intValue; // int -> double
    		System.out.println("doubleValue1 = " + doubleValue); //doubleValue1 = 10.0
    
    		doubleValue = 20L; // long -> double
    		System.out.println("doubleValue2 = " + doubleValue); //doubleValue2 = 20.0
      } 
    }
    

 

형변환2 - 명시적 형변환

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

 

명시적 형변환

double doubleNum = 10.0; 
int intNum = (int) doubleNum; // intNum = 10;

 

주의

  • 형변환을 한다고 해서 변수의 타입이나 안에 있는 값이 변경되는 것은 아니다.
  • 변수에서 읽은 값을 형변환하는 것이다.
  • 변수의 값은 대입연산자를 사용해 직접 대입할 때만 변경된다.

 

오버플로우

  • 타입의 기존 범위를 초과해 표현할 경우 전혀 다른 숫자가 표현되는 경우
  • 오버플로우는 발생하는 것 자체가 문제이기 때문에 오버플로우가 발생했을 때 결과가 어떻게 되는지 계산하는데 시간을 낭비하면 안된다.
  • 잘못된 숫자를 활용할 생각하지 말고, 잘못된 숫자가 안 나오게 수정하는 것에 초점을 맞춰야 한다.
    • 예시 : 타입을 int → long 변경

 

자바에서 타입 규칙 2가지

  1. 같은 타입끼리의 계산은 같은 타입의 결과를 낸다.
  2. 서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.

 

Reference

인프런 '김영한의 실전 자바 - 기본편'

 

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

[자바/입문] 8. 메서드  (2) 2023.12.29
[자바/입문] 7. 배열  (0) 2023.12.29
[자바/입문] 4. 조건문, 5. 반복문  (2) 2023.12.29
[자바/입문] 2. 변수, 3. 연산자  (0) 2023.12.29
[자바/입문] 1. 자바란?  (0) 2023.12.29

4. 조건문

조건에 따라 로직을 다르게 실행해야할 때 사용하는 문법으로 자바에서는 if, else if, else가 있다. 

 

상황에 따라 다른 if 사용법

- if문 + else if 문 : 서로 연관된 조건일 때

- if 문 따로 : 서로 연관이 없는 독립 조건

 

 

5. 반복문

 

for문

장점

  1. 초기화, 조건 체크, 반복 후의 작업을 한줄에서 처리할 수 있어 편리하다.
  2. 정해진 횟수만큼의 반복을 수행하는 경우에 사용하기 적합하다.
  3. 루프 변수의 범위가 for 루프 블록에 제한되므로, 다른 곳에서 이 변수를 실수로 변경할 가능성이 적다.

단점

  1. 루프의 조건이 루프 내부에서 변경되는 경우, for 루프는 관리하기 어렵다.
  2. 복잡한 조건을 가진 반복문을 작성하기에는 while문이 더 적합할 수 있다.

 

while문

장점

  1. 루프의 조건이 루프 내부에서 변경되는 경우, while 루프는 이를 관리하기 쉽다.
  2. for 루프보다 더 복잡한 조건과 시나리오에 적합하다.
  3. 조건이 충족되는 동안 계속해서 루프를 실행하며, 종료 시점을 명확하게 알 수 없는 경우에 유용하다.

단점

  1. 초기화, 조건 체크, 반복 후의 작업이 분산되어 있어 코드를 이해하거나 작성하기 어려울 수 있다.
  2. 루프 변수가 while 블록 바깥에서도 접근 가능하므로, 이 변수를 실수로 변경하는 상황이 발생할 수 있다.

 

for, while 한줄 정리

정해진 횟수만큼 반복을 수행해야 하면 -> for문을 사용

그렇지 않으면 -> while문을 사용

물론 이것이 항상 정답은 아니니 기준으로 삼는 정도로 이해하자

 

Reference

인프런 '김영한의 실전 자바 - 기본편'

 

2. 변수란?

  • 변할 수 있는 수
  • 데이터를 담을 수 있는 그릇

 

변수 선언 시 초기화도 같이 하자

변수를 선언하면 메모리 상의 어떤 공간을 차지하고 사용된다. 그런데 그 공간에 기존에 어떤 값이 있었는지 모르고, 이를 초기화하지 않으면 이상한 값이 출력될 수 있다. 그래서 변수 선언을 하면 초기화도 같이 하도록 하자.

 

리터럴

코드에서 개발자가 직접 적은 100, 1, true, ‘A’, “Hello Java”와 같은 고정된 값을 프로그래밍 언어로 리터럴이라 한다. 변수의 값은 변할 수 있지만, 리터럴은 개발자가 직접 입력한 고정된 값이다. 리터럴 자체는 변하지 않는다.

 

실무에서 가장 자주 사용하는 타입

  • 정수
    • int : 약 20억까지 가능
    • long : 20억을 넘어가는 수에 지정, 끝에 L을 붙여야 한다.
  • 실수 : double
  • 불린 : boolean
  • 문자열 : String

 

3. 연산자

연산자는 값을 계산할 수 있게 하는 문자를 의미한다. 다양한 연산자가 있지만 자주 사용하는 연산자 위주로 기억하면 되고, 연산자 우선순위 굳이 외울 필요가 없다. 

 

자주 사용하는 연산자

  • 산술연산자: + , - , * , / , % (나머지)
  • 증가 및 감소 연산자: ++ , --
  • 비교연산자: == , != , > , < , >= , <=
  • 논리 연산자: && (AND), || (OR), ! (NOT)
  • 대입연산자: = , += , -= , *= , /= , %=
  • 삼항 연산자: ? :
  • instanceof 연산자: 객체 타입을 확인한다.
  • 그외: new , [] (배열 인덱스), . (객체 멤버 접근), () (메소드 호출)

 

비트 연산자

비트 연산자는 실무에서 거의 사용할 일이 없다. 필요할 때 찾아보자.

비트 연산자: & , | , ^ , ~ , << , >> , >>>

 

 

Reference

인프런 '김영한의 실전 자바 - 기본편'

 

자바로 계속 개발을 해왔기에 자바를 어느정도 잘 안다고 생각했는데, 막상 강의를 들어보니 기본기가 안 잡힌 부분이 꽤 많아서 강의를 기반으로 기억해두면 좋을 내용 위주로 정리했다. 

 

1. 자바란?

프로그래밍 언어 중 하나로, 표준 스펙과 이를 구현한 구현체가 있다. 인텔리제이에서 자바 버전을 선택할 때 Oracle, Amazon Corretto 와 같이 종류가 여러개라서 무엇인지 파악을 못했는데 알고보니 자바는 표준 스펙이 있고, 그를 기반해서 각 회사가 본인 스타일로 구현체를 만들어서 다양한 버전이 있는 것이었다.

  • 자바 표준 스펙
    • 자바 설계에 대한 설계도이고, 문서
    • 이를 기반으로 회사에서 실제 작동하는 자바를 만듦
    • 자바 커뮤니티 프로세스(JCP)를 통해 관리됨
  • 다양한 자바 구현
    • 자바 표준 스펙에 맞추어 실제 작동하는 자바 프로그램을 개발한다
    • 예시로, Amazon Corretto는 AWS에 최적화 되어 있다

 

2. 표준 스펙과 구현의 이점 - 변경의 용이

자바 구현들이 모두 표준 스펙에 맞춰 개발이 되었기 때문에 다른 자바로 변경을 문제 없이 할 수 있다.

 

3. 컴파일과 실행

코드를 실행하기 위해서는 컴파일이라는 단계가 선행되어야 한다.

  • 컴파일
    • 자바 소스코드 → 바이트 코드로 변환
    • .java → .class 로 파일 확장자 변경
    • 바이트 코드로 변환된 파일이 JVM에서 실행됨

 

4. IDE와 자바

인텔리제이에서는 내부에 자바를 편리하게 설치하고 관리할 수 있는 기능을 제공한다. IDE를 사용해 쉽게 자바를 실행만 해봤지 IDE가 어떤 과정을 통해 파일을 컴파일하고 실행하는지 잘 몰랐다;; 

 

 

인텔리제이를 통한 자바 컴파일/실행 과정

  • 인텔리제이에서는 컴파일과 실행 모두를 한번에 처리한다
  • 컴파일
    • 인텔리제이 out 폴더에 가면 컴파일된 .class 파일을 확인할 수 있고, 이게 JVM에서 실행 된다

 

 

5. 자바의 JVM과 OS 독립성

os별로 명령어가 다르기 때문에 특정 os의 파일은 다른 os에서 실행할 수 없다. 하지만 자바의 경우, 자바가 설치된 os라면 종류에 상관없이 자바 프로그램을 실행 할 수 있다.

 

 

 

Reference

인프런 '김영한의 실전 자바 - 기본편'

+ Recent posts