변수 종류
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를 나감, 밑으로 내려가지 않는다.

+ Recent posts