백엔드/JAVA

기본 계산기 만들기 예제 실습

두개의 문 2023. 5. 1. 20:38
기본 계산기 만들기

 

package calc;
public class CalcEx {
	public static void main( String [] args) {
		// main 메소드에서 각각의 메소드를 호출하기
		int x = 100;
		int y = 50 ;
		int result ;
		
		result = add(x, y);
		System.out.printf("%d + %d = %d", x, y, result );
		display ( result );
		
		result = sub(x, y);
		System.out.printf("%d - %d = %d", x, y, result );
		display ( result );
		
		result = mul(x, y);
		System.out.printf("%d * %d = %d", x, y, result );
		display ( result );
	
		result = div(x, y);
		System.out.printf("%d / %d = %d", x, y, result );
		display ( result );
			
	}
	
	public static int add ( int x, int y ) {
		return x + y ;
	}

	public static int sub ( int x, int y ) {
		return x - y ;
	}
	
	public static int mul ( int x, int y ) {
		return x * y ;
	}
	
	public static int div ( int x, int y ) {
		return x / y ;
	}
	public static void display ( int iResult ) {
		System.out.println("result = " + iResult);
	}
}


- static : 인스턴스를 생성하지 않고도 호출이 가능한 메서드
- main메서드 다음에 나오는 { } = 메서드의 시작과 끝을 의미
  → main메서드 : Java application의 시작점

  → 대입되는 변수, 상수를 이용해 알고리즘을 통과시켜 그 결과를 반환함

     ( 정적인 데이터를 동적으로 바꿔줌 )

 


- void : 메서드의 작업 수행 결과인 반환값이 없는 경우, 반환타입(return type)으로 void라고 적음
- return : 메서드의 반환타입이 'void'가 아닐 경우, 'return 반환값;' 반드시 포함시켜야 함 
( ※ 값의 타입이 반환타입과 일치 또는 자동형 변환 가능한 타입이어야 함 )
 

 

- main 메소드에서 각각의 메소드 호출하기

① add 메소드 호출하기

② add 메소드의 입력값 : 2개 필요

    add ( x, y );

③ x, y에 대한 변수 선언과 초기화

  int x = 100;
  int y = 50 ;
  add(x, y);

④ 결과를 반환하기 위한 변수 필요

  int x = 100;
  int y = 50 ;
  int result ;

  result = add(x, y);


⑤ public static int add ( int x, int y ) {
           return x + y ;
     }

→ add 메소드 : 입력값 2개를 받아서 호출 시, 결과가 int형으로 반환됨을 의미

- 메소드 중복 시, Error ) Duplicate method add ( int, int ) in type myCalc 

 

 

※ 가능하면 데이터는 최소 범위로 만들자, 대신 함수로 넘기자

⑥ 출력하는 메소드도 따로 분리 

public static void display ( int iResult ){
            System.out.println("result = " + iResult);
}

 

 


데이터 타입 비교 : 기본형 / 참조형

 

 

· 저장되는 값의 차이

기본형 참조형
  ① 정수 타입 : byte, short, int, long, char
  ② 실수 타입 : float, double
  ③ 논리 타입 : boolean
  배열 타입, 열거 타입, 클래스, 인터페이스
  → 기본형을 제외한 나머지
  데이터의 실제 값을 스택(stack) 영역에 저장   객체의 주소를 스택(stack) 영역에 저장
  메모리의 힙(heap) 영역에 실제 값을 저장
   스택 영역의 객체의 주소를 참조해 힙 영역에 있    는 데이터 값을 가져옴
 비객체이므로 null값을 가질 수 없음
 ( 정해진 기본값 있음 )
  null값으로 초기화 가능

 

 

 

 

· 메모리 영역

1. 메소드 영역

  - JVM이 시작할 때 생성 / 모든 스레드가 공유하는 영역

  - 코드에서 사용되는 코드들을 클래스 로더로 읽어 클래스별로 정적 필드와 상수, 메소드 코드, 생성자 코드 등을 분류해서 저장

 

2. 힙 영역

  - 객체와 배열이 생성되는 영역 

    → 여기서 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조함

  - 만일 참조하는 변수나 필드가 없는 경우 : 의미 없는 객체로 쓰레기 수집기 (Garbage Collector)를 실행 → 자동으로 제거됨

 

3. 스택 영역

  - 메소드를 호출할 때마다 프레임을 추가 (push) / 메소드 종료 시 해당 프레임을 제거 (pop)

  - 프레임 내부 → 로컬 변수 스택 존재

  - 로컬 변수 스택 : 기본 타입 변수와 참조 타입 변수가 추가되거나 제거됨

  ※ 변수는 선언된 블록 안에서만 스택에 존재 / 블록을 벗어나면 스택에서 제거

 

 

 


참조 변수의 ==, != 연산

- 참조 타입 변수 간의 ==, != 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는 지 알아볼 때 사용

- 즉, 동일한 번지 값을 갖고 있다 → 동일한 객체를 참조한다는 의미

- 동일한 객체 참조 : true / 서로 다른 객체 참조 : false 

 

 

 


null & NullPointerException ( NPE )

- null

  ① 참조 변수가 가리키는 객체가 없을 때 

      → 힙 영역의 객체를 참조하지 않는다는 의미

  ② 참조변수의 초기값

      → null로 초기화된 참조 변수는 스택 영역에 생성됨

 

- 예외 (Exception) : 프로그램 실행 도중 발생하는 오류

- 참조변수를 사용하면서 가장 많이 발생하는 오류 : NullPointerException ( NPE )

  · 참조 변수 = null 값 → 참조 객체가 없다는 의미

  ∴ 변수를 통해 객체를 사용할 수 없음

  · 만일 null 상태에서 있지도 않은 객체의 데이터나 메소드를 사용하는 코드 작성 시, 오류 발생

int [] intArray = null ;              // 배열 변수 → 참조변수에 해당 & null값으로 초기화 가능
intArray[0] = 10 ;                    // 참조하는 배열 객체가 없는 상태인데 데이터 값을 저장하려고 함 → NullPointerException : 

 

 


String 타입

 

- 변수 선언과 문자열 저장

String name;
name = "신용권";
String hobby = "자바";

· 스택 영역 : name변수와 hobby변수에 String 객체의 주소값 저장

· 힙 영역 : String 객체에 문자열 리터럴인 "신용권"과 "자바" 생성

 

- String 객체 생성 방법

 ① 문자열 리터럴 사용 

String name1 = "신용권";
String name2 = "신용권";

  · 문자열 리터럴 동일한 경우, String 객체 공유 → 동일한 객체 참조

 

 ② new 연산자 사용

   · new 연산자 (= 객체 생성 연산자 ) : 힙 영역에 새로운 객체를 만들 때 사용하는 연산자 

String name1 = new String("신용권");
String name2 = new String("신용권");

  → 서로 다른 객체 참조

 

- 내부 문자열만 비교하고 싶을 때 : String 객체의 equals() 메소드 사용

boolean result = str1.equals(str2);
→ str1 : 원본 문자열 / str2 : 비교 문자열

 

- String 변수 또한 참조타입이므로 초기값으로 null값 설정 가능

  단, 이때 null은 String 변수가 참조하는 String 객체가 없다는 뜻

String hobby = "자바";
hobby = null ;

  ① hobby 변수가 String 객체 참조

  ② null값 대입 → 더 이상 String 객체 참조하지 않음

  ③ 참조를 잃은 String 객체는 JVM이 쓰레기 수집기(Garbage Collector)를 구동시켜 메모리에서 자동 제거됨

  

 

 


배열

- 배열 : 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

- 배열의 index : 배열의 각 요소 ( 저장공간 )에 자동으로 붙는 일련 번호 

  ① 자동으로 0부터 시작

  ② 인덱스의 범위는 0부터 '배열길이-1'까지

- 배열의 특징

 ① 같은 타입의 데이터만 저장 가능

     선언과 동시에 저장할 수 있는 타입이 결정 → 만약 다른 타입의 값을 저장할 경우, Type mismatch 컴파일 에러 뜸

 ② 한 번 생성된 배열은 길이 변경 불가

     

- 배열의 선언과 생성

 ① 배열의 선언  : 배열을 다루기 위한 참조변수의 선언

    타입[] 변수이름; -> 자바에서 더 선호

    타입 변수이름 [];

 ② 배열의 생성 : 실제 저장공간을 생성

    변수이름 = new 타입 [길이]; 

 

- 배열 변수 → 참조 변수에 해당

  : 배열도 객체이므로 힙 영역에 생성 / 배열 변수는 힙 영역의 배열 객체를 참조

  · 참조할 배열 객체가 없는 경우, 배열 변수 = null값으로 초기화

  · 배열 변수가 null 값을 가진 상태에서 변수[인덱스]로 값을 읽거나 저장하게 되면, NullPointerException 오류 발생

  ※ 배열을 생성하고 배열 변수가 참조하는 상태에서 값을 저장하거나 읽어와야 함   

 

- 배열 생성 방법

 ① 값 목록으로 배열 생성

 String[] names ={ "신용권", "홍길동", "감자바" };

 · 배열 객체를 힙 영역에 생성

 · 배열 객체의 주소를 리턴 → 배열 변수에 저장하여 참조함

 ※ 배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않음

  → 배열 변수를 미리 선언한 후, 값 목록이 나중에 결정되는 상황일 경우, new 연산자를 사용

String [] name;
name = { "신용권", "홍길동", "감자바" };          // 컴파일 에러
→ name = new String[] { "신용권", "홍길동", "감자바" }; 

 

 ② new 연산자로 배열 생성

   · 값의 목록을 가지고 있지 않지만, 향후 값들을 저장할 배열을 미리 만들고 싶을 때

 int [] intArray = new int[5];          // 길이 : 저장할 수 있는 값의 개수

    → new 연산자로 배열을 처음 생성할 경우, 자동으로 기본값으로 초기화됨

 

   · 이미 배열 변수가 선언된 경우에도 new 연산자로 배열 생성 가능

int [] intArray = null;
intArray = new int [5]; 

 

- 배열의 길이

  · 배열이름.length -> 배열의 길이 (int형 상수)

  · " 배열은 한번 생성해서 실행하면 그 길이를 바꿀 수 없다. 

  · for문을 사용해 배열의 모든 요소 출력 시 유용함

int [] score = new int[6];
for ( int i = 0 ; i < score.length ; i++ ) {
       System.out.println( score[i] );
}