변수 종류
1. 지역변수 (메소드 안에서 정의)
2. 멤버변수
3. 정적변수
메소드 호출
- 괄호, 괄호안의 변수가 기본자료형으로 되었을땐 Call by Value 로
- 클래스, 재열, 인터페이스면 주소를 넘기는 방식으로 호출 Call by Reference로
자료형 변환 3가지 방법
1. 기본 자료형 변환 : 기본자료형 변수들끼리 변환 ex)double <-> int
2. Wrapper 클래스를 이용한 자료형 변환 기본자료형과 참조형사이 변환 ex)int <-> String
3. 두 클래스사이에 상속이 전제되어야가능한 (업캐스팅, 다운캐스팅) 레퍼런스 형변환
자바 패키지
- java.io.* : 입출력관련 클래스를 모아둔 패키지 ex) BufferedReader, FileReader, FileWriter, File 등
- java.net.* : 소켓통신관련 패키지
- java.sql.* : 오라클,mysql등의 데이터베이스와 연동할때
*지금까지 만든 것들은 모두 괄호 안의 지역변수
ex) main 메소드 안에서 선언한 지역변수는 main 안에서만 사용가능
지역변수가 되기 위한 조건
1. 메소드 안에서 정의되는 변수
- 메소드 안에서만 정의되어 사용되는 변수. 그 안을 벗어나는 순간 메모리에서 지워짐
- 스택이라는 메모리 영역에 저장된다.
2. 매개변수도 지역변수다.
- 메소드 괄호안에서 사용되는 변수
3. 블럭문(조건문 , 반복문)안에서 사용되는 변수도 지역변수다.
지역변수 특징
- 해당 메소드가 호출될때 스택 메모리에 할당되고, 메소드 실행이 종료되면 자동으로 메모리가 해제된다.
기본 자료형 변환 2가지
1. 묵시적 형변환(자동 형변환) : 컴파일러가 컴파일러하면서 자동으로 형변환 시켜준다.
- 작은 자료형 데이터를 큰 자료형 데이터로 형변환할때는 자동으로 변환해준다.
- int -> float 같은 4바이트지만 float형이 더 큰 자료형으로 인식된다. 그러므로 묵시적 형변환(자동) 된다.
- byte < short = char < int < long < float < double
- long 은 8 바이트, float은 4바이트지만 float(실수형) 이 더 큰걸로 취급된다.
2. 명시적 형변환(강제 형변환) : 컴파일러가 자동으로 변환시켜주지 않는다, 우리가 직접 강제로 형변환 시켜야함
ex) int -> char, char c = 97 일때는 오른쪽은 int이므로 자동으로 형변환 안됨 그러므로 char c = (char) 97; 해야함
ex) double -> int, int a = (int) 3.14 (오른쪽은 double 이므로 강제형변환해야)
패키지 추가
- 위에 1라인 좌측의 x를 더블클릭
아스키코드
- 문자는 내부적으로 아스키코드에 따른 숫자로 표현됨(십진수)
ex) 'a'를 int 형 자동 형변환 되면 출력하면 97이 나온다.
아스키코드 값
- 'A' : 65
- 'a' : 97
명시적 형변환(강제 형변환)
- 직접 변환 시키는것, 강제 형변환
- 큰 자료 데이터 -> 작은 자료 데이터
- 괄호안에 왼쪽과 일치되는 자료형을 써준다.
ex) char c = (char)97;
ex) int a = (int)3.14;
ex) random 메소드 쓰면 double형 데이터가 나옴 -> int로 강제 형변환
명시적 형변환 주의점
- int -> char 강제형변환하면 아스키코드 맞는 값 나온다.
- '형변환 과정에서 데이터 손실이 일어난다'
- float -> int : 소수점 이하를 '버림' (반올림 X)
- double -> float 강제형변환 : 소수점 길이가 긴상태에서 하면 짤림, 정확성이 보장되지 않는다.
+변수 선언
- int a = 10, b = 3, c; 이런식으로 int 변수 3개 생성 가능
연산자
- 언어 공통적으로 씀
- 변수와 변수사이 관계 연결할때 씀
- 산술연산자
- 비교연산자
- 조건연산자
- 논리연산자
- 대입연산자
- 증감연산자
산술연산자 : 산술적인 연산
+ , - , * , / , % (나머지)
산술연산자 주의1
- System.out.println("a / b = " + (a/b)); // 3(몫),
- int와 int 연산이라서 같은 int형으로 출력되는거임. 3.333..아니라 3만 나옴.
- 기본자료형끼리만 산술적인연산이 가능
ex) String 클래스 와 기본자료형 끼리 결합시 "파이썬" + 50 하면 "파이썬50" 으로 '연산'이 아닌 '결합'된다
산술연산자 주의2
int n1, n2, n3, n4, n5, total;
double avg;
total = n1 + n2 + n3 + n4 + n5;
avg = total / 5;
- int형인 total과 int형인 5끼리 연산했으므로 결과는 int형으로서 뒤의 소숫점이 모두 잘리게 나온다. (정수로)
처리방법
1. avg = total / 5.0
- 5.0은 더블형이므로 소숫점이 짤리지 않는다.
2. avg = (double)total / (double)5;
- 둘 중 하나만 double넣어도됨
- int와 double을 산술연산하면 double로 처리된다. (더 큰 자료형으로 처리된다.)
산술연산과 자료형
같은 자료형끼리 산술연산 -> 같은 자료형으로 결과가 처리된다
다른 자료형끼리 산술연산 -> 더 큰 자료형으로 결과가 처리된다.
문자열 연결/결합
- + 연산자
비교연산자 (=관계연산자) : 변수의 크기 비교해줌
- 값은 true / false
- if 문 조건식 만들때 많이 사용한다. ex) if(a == b) 나 if(a != b)
- > , >= , < , <= , == , !=
- char 끼리 비교 가능(문자가 아니라 내부 아스키코드 번호로 변환되어 비교)
참조형 변수의 비교
- 기본형 변수는 값을 저장하므로 값을 연산자로 비교 가능
- 참조형 변수들은 값을 저장하지 않기때문에 주의해야함
ex) String은 참조형 변수 중 '클래스' 중 하나
지역변수
- 지역변수는 "스택 영역"에 저장됨.
참조형 변수 (클래스, 배열, 인터페이스)
- String 클래스는 기본 자료형처럼 String s1 = "50" 문자열을 저장하는것처럼 보임
- but 메모리상에서 데이터 저장방식이 다르다.
- 값을 저장하는 영역과 그 영역의 주소값을 저장하는 영역이 따로 분리되어있다.
- 값은 힙에 , 주소값 저장하는 변수는 스택에 저장된다. 배열,인터페이스도 마찬가지이다.
참조형 변수의 비교 예시(String)
- 참조형은 값은 모두 힙이란 영역에 저장되고, 스택이란 메모리 영역에서 변수들이 값의 시작 주소값을 가지고 있다.
- s1, s2는 이 "자바"란 값을 가리키고 있다, 즉 주솟값을 가지고 있다.
String s1 = "자바" ;
String s2 = new String("자바")
- 이 두가지 방식은 메모리상에서 처리되는데 차이가 있다(의미가 다르다)
* String 클래스만 값을 바로 저장해도 되고 new 를 통해서 String객체 생성하는 방식으로
만들수도 있다.
String str1 = "자바";
String str2 = "자바";
String str3 = new String("자바");
1. str1, str2 처럼 기본 변수처럼 선언할땐,
- "자바"가 적힌 곳의 시작 주소값을 갖게 된다.
- str2 에 같은값인 "자바"를 할당하면 str2도 str1이 가리킨 같은 "자바" 를 같이 가리키게 됨. (새로운 공간을 만들지 않음)
- 즉 str1, str2는 같은 주소가 된다.
if(str1 == str2) {
System.out.println("같은 주소");
}else {
System.out.println("다른 주소");
}
출력 : 같은 주소
2. str3처럼 new 써서 객체를 만들어 선언할땐,
- new는 새로운 공간을 힙메모리에 만들어서 자바란 값을 저장하겠다는 의미!
- 그래서 힙메모리상에 "자바"를 새로 또 만들고 주솟값을 str3가 가진 형태로 된다.(그림참고)
if(str1 == str3) {
System.out.println("같은 주소");
}else {
System.out.println("다른 주소");
}
출력 : 다른 주소
그림
참조형 변수의 비교 (값을 비교)
- 참조형은 주소값을 비교할 때 비교연산자를 써야하는 것이고
- 참조형들은 값을 비교하려면 비교연산자로 비교할 수 없다.
- equals 메소드를 사용해서
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
- 해야 값을 비교할 수 있다.
클래스로 입력받기
- 키보드 입력받기 위한 클래스가 여러개 있다.
- java.io 패키지 안 클래스로 입력받을땐 예외처리 해야한다.
- 여기선 일단 예외처리 필요없는 Scanner 객체 생성해서 입력받자 java.utility
Scanner sc = new Scanner(System.in); //Scanner.class 라는 바이트 코드 안에 있는 클래스/메소드
int n1 = sc.nextInt(); //첫번째 값과 두번째 값 구분은 스페이스바 or 엔터키로 구분함.
int n2 = sc.nextInt();
+ Scanner 쓸때 부분 입력과 동시에 import하는법 Ctrl + Space
클래스 구조 (api 문서)
- 클래스는 생성자, 메소드, 필드 가 있다
- 클래스로 객체를 만들때 생성자를 호출하게된다
- 생성자는 클래스와 동일한 명으로 되어있고 제공되는 것들만 쓸 수 있다. (제공되지 않은 생성자로는 불가능)
- 생성자는 메소드 형태로 되어있기 때문에 괄호가 반드시 있다
Scanner 클래스 구조
- 라이브러리는 클래스형태로 되어있다 입력을받을때 쓰는 Scanner 클래스
- Scanner 객체 만들어서 사용한다.
- java.lang 패키지 안의 클래스 아니므로 import해야함
Scanner Class는
java.lang.Object (부모)
java.util.Scanner
1. Scanner 생성자
- Scanner 중 매개변수가 InputStream source라고 되어있는거를 선택하여 입력받을 수 있다.
Scanner(InputStream source)
Constructs a new Scanner that produces values scanned from the specified input stream.
- 우리는 생성자 중 이걸 쓴다.
- (InputStream source) 안에 System.in 이라고 쓴다(입력위해)
+ system 클래스 안에 in은 자료형이 InputStream
2. Scanner는 필드는 없다.
3. Scanner 메소드
nextInt() 메소드 : 키보드로 정수형태의 값 입력 받을때 쓰는 Scanner 안의 메소드
+ nextDouble(), nextInt() 등 자료형에 따라서 있다.
- nextInt() 메소드는 return형이 int형이다. 그래서 왼쪽도 int 변수가 와야함.
- nextDouble()오면 실수형으로 처리됨 (return형이 Double)
- nextLine() 오면 내가 10 와 20 입력해도 숫자가 아니라 문자로 처리됨 (return형이 String)
Scanner sc = new Scanner(System.in);
//Scanner.class 라는 바이트 코드 안에 있는 클래스/메소드
//표준 입력받을땐 System.in을 생성자로
int n1 = sc.nextInt();
//첫번째로 정수를 받아서 n1에 저장하란 뜻
int n1 = sc.nextInt(); //첫번째 값과 두번째 값 구분은 스페이스바 or 엔터키로 구분함.
int n2 = sc.nextInt();
+ sc.nextInt() '객체'에 메소드! 이걸 int 형 변수에 저장
+ 파일로 부터 입력을 받을때 쓰는 생성자는 Scanner(File source) , Ctrl + Space 하면 볼 수 있다
조건 연산자
변수 = (조건식) ? 값1 : 값2;
- 조건식이 참이면 값1을 변수에 할당
- 조건식이 거짓이면 값2를 변수에 할당
+ 자바는 변수선언을 꼭 위에만 할수있는건 아니다
논리연산자 : ||, &&, ! ( 자바는 기호를 써야함)
- OR연산자 , AND 연산자, NOT 연산자
- 조건식이 2개 이상인 경우에 논리연산자(||, &&) 를 쓴다.
ex) if( a>b || a>c)
ex) if( a>b && a>c)
1. OR 연산자(||)
- 둘중 하나라도 True 가 있으면 True가 됨
- 둘다 False 여야만 False가 됨
2. AND 연산자(&&)
- 둘 다 true 인경우에만 true가 되고 나머지는 false가 됨
3. NOT 연산자(!)
- 기존 논리값을 반대로 바꿔줌
- true앞에 !가 오면 false가 되고 반대도 성립
확장 대입 연산자(= 복합 대입 연산자)
- 간결히 표기할때
- a += b; 는 a+b를 먼저 수행하고 결과를 a로 다시 할당 시켜란 의미
a+=b; // a = a + b;
a-=b; // a = a - b;
a*=b; // a = a * b;
a/=b; // a = a / b;
a%=b; // a = a % b;
증감 연산자
- (++) : 1씩 증가
++a(선행 처리) // a=a+1;
a++(후행 처리) // a=a+1;
- (--) : 1씩 감소
--a(선행 처리) // a=a-1;
a--(후행 처리) // a=a-1;
증감 연산자 주의
- 변수명 앞에 오느냐 뒤에오느냐에 따라 다르다.
- ++가 앞에있으면 먼저 처리하고 그 줄을 넘어가라
- ++가 뒤에있으면 그 줄을 넘어가고 연산을 수행하라.
ex)
b= 10;
b1 = b++; // 후행 연산, 이 줄에선 b가 증가하지 않음.
출력 : b = 10, b1 = 11
자바의 제어문
1. 조건문(=선택문)
- if문
- switch~case문
2. 반복문
- for문
- while문
- do~while문
3. 보조제어문
- break문
- continue문
1. if문
if(조건식){
조건식이 참인경우 실행될 문장;
}
if(조건식){
조건식이 참인경우 실행될 문장;
}else{
조건식이 거짓인경우 실행될 문장;
}
// 둘 중 하나는 반드시 실행됨
if(조건식1){
조건식1이 참인경우 실행될 문장;
}else if(조건식2){
조건식2가 참인경우 실행될 문장;
}else{
위의 조건식을 만족하지 않을때 실행될 문장;
}
// 가장 먼저 해당하는 것의 문장을 실행하고 if문 전체를 나간다
// 딱 1개만 수행된다. 즉 위에서 조건이 참인걸 만나면 수행후 if를 나감, 밑으로 내려가지 않는다.
'국비지원 과정 > JAVA' 카테고리의 다른 글
코딩 6일 / 2022.06.28 / JAVA의 클래스,객체,필드,생성자 (0) | 2022.07.01 |
---|---|
코딩 5일 / 2022.06.27 / JAVA의 배열2,참조형,클래스,객체 (0) | 2022.06.28 |
코딩 4일 / 2022.06.24 / JAVA의 제어문3,메소드,배열1 (0) | 2022.06.27 |
코딩 3일 / 2022.06.23 / JAVA의 제어문2, 난수발생 (0) | 2022.06.26 |
코딩 1일 / 2022.06.21 / JAVA란,JAVA의 자료형 (0) | 2022.06.22 |