1. 상수
(1) 정의
상수는 한번 저장한 데이터 값을 변경할 수 없다
format: final datatype VARNAME;
public static void main(String[] args){
//변수
int age = 30;
String name = June;
/*age = 20; 로 수정 가능*/
//상수
final int NUMBEROFPEOPLE=10;
final String GROUPNAME="School";
/*NUMBEROFPEOPLE = 20;로 수정 불가능*/
}
2. 변수
(1) 정의
값(data)을 저장할 수 있는 메모리 공간
값이 변할 수 있는 수로, 컴파일 될 시 변수 타입이 결정된다.
(2) 규칙
ㅇ Camel Case
ㅇ 숫자로 시작 불가능(숫자는 사용 가능)
ㅇ 첫 레터는 소문자
ㅇ Reserved words 사용 불가능 [ex. abstract, try, void, null, static ... ]
(3) 기본형 타입(Data Type)
기본형 타입은 가장 기본이 되는 데이터 타입으로써 정수형, 실수형, 문자형, 불리언형을 의미한다
표현 형태 | 데이터 타입 | Byte |
논리형 | boolean | 1 |
문자형 | char | 2 |
정수 | byte | 1 |
short | 2 | |
int | 4 | |
long | 8 | |
실수 | float | 4 |
double | 8 |
(4) 산술연산자
1) 연산: 데이터를 처리하여 결과를 산출하는 것
2) 연산자
a. 부호 연산자: +,-
b. 산술 연산자: +,-,/,*,%
c. 증감 연산자: ++, --
3) 연산식: 연산자와 피연산자를 이용하여 연산의 과정을 기술한 것
x = y + z;
x: 피연산자(operand) - 연산의 대상이 되는 데이터(리터럴(값), 변수)
= , + :연산자
void 산술연산자(){
/*
산술연산자의 규칙:
(int 보다 같거나 작은 타입의 산술연산자) 산술연산자 (int 보다 같거나 작은 타입) => int
byte(1), char(2), short(2), int(4)
*/
System.out.print('a'+ 1);
/*풀이:산술연산자 + 가 쓰였으며, char은 int 보다 작은 타입이며 1은 int 이다
따라서 공식을 참조해보면,
char + int => int 따라서 결과값은 int 타입이다
'a' 의 int 값은 97 이므로 답은 98이 된다
*/
System.out.println('a'+'1');
/*풀이: 본인이 헷갈렸던 문제
이 역시 산술 연산자 + 가 쓰였으므로 결과값이 int인지 확인해보자
char 은 int 보다 작다. 따라서 char + char = > 여전히 int 값을 리턴할 것이다
따라서, 답은 a1이 아니라 97 + 49 = 146이 된다
*/
}
(5) 타입변환
(정수) byte < short, char < int < long < (실수) float < double |
1) 묵시적 형변환
작은 타입 -> 큰타입
2) 명시적 형변환
큰타입 -> 작은 타입 : "강제 형변환"
void 형변환(){
System.out.print(5/2);
/*답: 2
*/
System.out.println((double)5/2);
/*풀이:
(double)5 = 5.0
5.0 / 2 = 2.0
*/
System.out.println((double)(5/2));
/*풀이:
(double) (5/2 = 2)
(double) 2 = 2.0
*/
//배정연산
int x = 100*100;
if ( x> 100 ){
x = x*0.9; //오류 발생
/*이유: x = x*0.9 는 int = int * double
즉 작은 타입에서 큰 타입으로 declare하는 중이다
따라서 형 변환이 필요하다. ex) x = (int)(x*0.9);
또한, 위의 코드를 그대로 나타내는것이 배정연산이다
배정 연산은 형변환을 자동으로 구현해주어서 따로 타입캐스팅은 필요 없다*/
x*=0.9;
}
}
(3) 변수의 범위
변수는 맴버 변수와 로컬 변수가 있다
1) 맴버 변수: 클래스 변수라고도 하며, 메서드 밖에 선언되는 변수이다.
2) 로컬 변수: 메서드 안에 선언되는 변수로 지역변수의 범위는 블록 단위이다
-> main method는 static이기 때문에, 맴버 변수라 할지라도 static type이 아니라면 객체를 생성해서 불러야 한다
그럼 죄다 static을 쓰지 왜 헷갈리게 썻다 안썻다 하는가? (내가 처음 자바 코딩할때 가지고 있던 의문...)
public class Vehicle{ static int wheelCount;}
public class Test{
public static void main(String[] args){
Vehicle car = new Vehicle();
Vehivle bike = new Vehicle();
car.wheelCount = 4;
bike.wheelCount = 2;
System.out.println(car, bike);
/*
결과는 둘 다 2 와 2 를 바퀴수로 갖는다.
Vehicle 클래스의 wheelCount 변수가 static이기 때문에, bike의 wheelCount를 초기화
시킬 때, wheelCount가 2로 초기화 되면서 car 가 가지고 있던 wheelCount값도 2가 되는
것이다
*/
}
}
맴버 변수의 데이터는 클래스에리어에, 로컬 변수/non-static 의 데이터는 힙에 저장이 된다.
또한, 메모리 효율성을 위해 d.breed(); 보다는 Dog.breed();사용이 권장된다. Dog.breed(); 는 바로 breed 정보를 가져오는 반면, d.breed();는 d->dog->breed 로 번거롭다.
class Dog{
String breed;
static String name;
}
class Test{
public static void main(String[] args){
Dog d = new Dog();
}
public void test(){
Dog d = new Dog();
d.breed = "boxer";
}
}
에러 발생 시 static 변수의 위치, 로컬 변수의 위치, 초기화 위치확인하기
'취준 > JAVA' 카테고리의 다른 글
추상화 (0) | 2022.05.17 |
---|---|
객체 지향 프로그래밍 (0) | 2022.05.17 |
Class Case Exception (0) | 2022.05.17 |
JAVA Basics (0) | 2022.05.12 |
다짐 (0) | 2021.07.15 |