기본 계산기 만들기
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] );
}
'백엔드 > JAVA' 카테고리의 다른 글
객체 지향 프로그래밍 이론(1) (0) | 2023.05.03 |
---|---|
가위, 바위, 보 게임 구현하기 예제 실습 (0) | 2023.05.02 |
1주차 ( ch3~ ch4 ) 이론 추가 (0) | 2023.04.29 |
1주차 수업내용 정리 및 주사위 게임 예제 실습 (0) | 2023.04.28 |
STS 환경설정 및 프로젝트 생성과 예제 실습 (0) | 2023.04.27 |