개발하는 삶
[Java] 조건문, 클래스, 메서드 본문
자바 개발 환경 설정
- 자바 SE 11 - window64
- 이클립스 UTF-8 인코딩 설정(새로 설치할때마다 초기화 해주는게 좋음)
- window - prefereces - encoding - General - content 어쩌구 - Text, java class file - default에 UTF-8 입력
- workspace - text file encoding - other - UTF-8 입력
이스케이프 문자
- 문자열 “” 에 들어가면 효과를 발휘함
- \t 탭
- \n 줄바꿈
- \” \’ \\
이클립스 단축키
- ctrl+ +.- 화면 폰트 확대/축소
- ctrl+D 한줄삭제
- ctrl+alt+↑↓ 행단위 복사
- alt + ↑↓ 행단위 이동
- ctrl + / 해당 줄 주석으로 만들기
- // 행 주석
- /* */ 여러줄 주석
- ctrl+space 자동완성
- ctrl+shift+o 자동으로 import문 만들기
비트 연산자
비트 이동 연산자
- x<<y x의 비트를 y만큼 왼쪽으로 이동
- x>>y x의 비트를 y만큼 오른쪽으로 이동
- x>>>y x의 비트를 y만큼 오른쪽으로 이동
비트 논리 연산자
- & : 두 비트 모두 1이면 결과 1
- | : 두 비트 중 하나라도 1이면 결과 1
- ^ : 두 비트중 하나는 1이고 나머지 0이면 결과 1
- ~ : not 비트반전
기본형 / 참조형 타입
- 기본형 타입
- 스택 메모리에 저장
- Null이 존재하지 않지만, 래퍼클래스를 통해 Null을 넣을 수는 있음
- 문법이 틀리면 컴파일 오류가 남
- 타입 변환(캐스팅) : 자료형을 호환되게 변경하는 방법
- 타입 프로모션 : 작은 자료형(int) -> 큰 자료형(float) 으로 대입 할때
- 종류
- boolean(1)
- byte(1), short(2), int(4), long(8)
- float(4), double(8)
- char(2)
- 참조형 타입
- 힙 메모리에 저장 : 주소값 저장
- 기본형을 제외한 모든 타입
- 빈 객체를 의미하는 Null 이 존재 -> NullPointException 에러
- 배열, enum, 클래스, 인터페이스 등
타입 추론 var
- Java 10 부터 가능
- 자바 10 미만 : String a = "abc";
- 자바 10 이후 : var a = "abc";
- var
- 컴파일러가 초기화한 값으로 타입을 유추함
- 지역변수. 선언/초기화를 동시에 해야함
변수 스코프
- 변수 스코프 : 변수를 사용할 수 있는 범위(스코프)
- ex ) {} 안에 변수 선언 -> {} 안에서만 사용 가능
- 지역변수
- {} 내에 선언됨 (함수 안의 변수)
- 메서드 내에서만 사용하는 메서드 내 변수
- 전역변수
- 클래스 속 인스턴스변수/클래스 변수
- 클래스 변수
- 클래스 내의 static 으로 선언된 변수
- 동일한 클래스 내 모든 객체들이 공유함
- JVM 시작 후 프로그램 종료 시까지 유지됨
지시자 및
- printf 에서만 쓸수있는것
- %b %d %f %c %s
- %n 줄바꿈
- print 는 줄바꿈 없이 출력하는 것
- char c = ‘’; ⇒ 에러. 문자는 빈 문자가 안됨.
- String s = “” ⇒ 빈 문자열
- char 은 '' 으로 나타내야함 ("" 안됨)
- “” ⇒ 문자열 , ‘’ ⇒ 문자
- 문자열은 어떤타입과 연산되도 문자열이 됨.
- 숫자+’0’ = 문자, 문자 -‘0’ = 숫자
- &&이 || 보다 우선순위로 계산됨
- 변수에 초기화할때, 8/16진수
- 8진수 : 02, -04 등 //0으로 시작하는 리터럴
- 16진수 : 0x5, 0xA 등 //0x, 0X로 시작함. 영문과 같이 구성된 리터럴
- 5E7 //5 x 10^7
- 0.12E-5 //0.12 x 10^-5
Scanner
import java.util.Scanner; //import문 추가. Scanner클래스 만들기
public class scan {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); //Scanner객체를 생성. 화면에서 입력받을 것
int num = scanner.nextInt(); //Scanner객체를 사용.화면에서 입력받은 정수를 num에 저장
int num2 = scanner.nextInt(); //이번엔 num2에 저장. 입력받을때 두개를 공백으로 구분
System.out.println(num);
System.out.println(num2);
//String input = scanner.next(); //공백까지 포함한 문자열
//String input = scanner.nextLine(); //엔터치기 전까지의 문자열
}
}
연산 메서드
- Math.round() 반올림 : 소수점 첫째자리에서 반올림함
- Math.round(4.23)
- Math.random() : 0.0 ≤ 값 <1.0 의 임의의 double 값
- 각 변에 다른 숫자(ex. 2)를 곱해 int형으로 바꿈
조건문
- 조건식 ? 참일때 : 거짓일때;
- if - else if - else 문
- switch {case 1 : default : 문}
- switch (변수) { case 1 : 문 }
- 경우의 수가 많을 때. case ‘’: ← 여기는 정수/상수/문자열만 가능
- 강화된 switch문 ( -> 이용)
- switch (input) {
case 1, 2, 3 -> System.out.println("wow");
}
- switch (input) {
- Loop1: for문… ⇒ 이름붙은 반복문 만들기
- break Loop1 = Loop1 이름붙은 반복문 빠져나오기
- for문
- for(int i=1; i<6; i++){}
- for(;;) //무한루프
- for (타입변수명(배열의 모든요소를 대입함): 배열) {반복할문장}
- label: for(조건식) {...} //for문에 라벨 부여하기 // break label; : label문 종료하기
- while (조건식) {}
- do {} while (조건식) ;
배열
- int[] score = new int[5];
- int score[] = new int[5];
- int[] score = new int[] {1,2,3,4,5}
- score.length = 5
- 배열 복사
- System.arraycopy()
- System.arraycopy(nun, 0, num, 0, nun.length);
- nun[0]부터 배열 끝까지 기준으로, num[0]에게 nun.length개의 데이터를 복사
- Arrays.copyOf()
- Arrays.copyOf(a, 4) : a[3]까지 복사. 칸 남으면 0으로 채워짐
- Arrays.copyOfRange(a, 1, 7) : a[1]~a[6]까지 범위복사
- System.arraycopy()
- 배열 출력
- import java.util.Arrays 혹은 import java.util.* 작성함
- Arrays.toString(score) = [1,2,3,4,5]
- Arrays.deepToString : 2차원배열
- 배열 비교
- Arrays.equals(a,b)
- Arrays.deepequals(a,b) : 2차원배열
- String 배열
- String[] name =new String[] {”aa”,”dd”,”ccc”};
- 문자열을 담은 배열
- 2차원 배열
- int[][] ss = {{10,20,20},{20,30,30}};
- 배열 정렬
- Arrays.sort(a);
String클래스
- 내용 변경이 불가능(읽기전용)
- 문자열로 반환하고싶을때 String 클래스를 정의함
- char 배열이 불편해서 만들어진 문자열로 이루어진 클래스
- String str = “ABCDE”;
- str.charAt(3) : str[3] 위치의 문자를 반환
- str.length() : 문자열 길이를 반환
- str.substring(0,4) : str[0]~str[3] 까지 문자열을 반환
- str.equals(str2) : 문자열의 내용이 같은지 확인 //문자열을 비교할땐 꼭 이걸 써야함!
- !str.equals(str2) : 문자열 내용이 같지 않다
- str.toCharArray() : 문자열을 char[]로 변환해서 반환
클래스
- public class의 "이름" = "소스파일명" (ex. Hello2.java) 오직 하나만!
- 클래스와 객체 생성
- class Tv {…메서드 등등};
- Tv t = new Tv();
- 객체 배열
- 배열 생성, 초기화를 꼭 해주어야함! (생성만 하면 객체는 생성되지않음)
- Tv[] tv = new Tv(3); //배열 생성
- tv[0] = new Tv() .... //배열 초기화 (수가 적을때)
- Tv[] tv = {new Tv(), ...} //배열 초기화 (수가 적을때)
- for(int i=0; i<tv.length; i++) { tv[i]=new Tv();} //배열 객체 각각 초기화 (수가 많을때)
Vector 클래스
- 객체를 저장하는 배열 느낌이라 보면 됨
- 메서드
- Vector() : 10개의 객체를 저장할 수 있는 Vector 생성. 10개 이상으로 추가되면 자동으로 늘어남
- add(Object o) : Vector에 객체 저장
- remove(Object o) : Vector에 저장되어 있는 객체를 제거
- isEmpty() : Vector가 비어있는지 검사
- get(int index) : 지정된 위치의 객체를 반환
- size() : Vector에 저장된 객체의 개수를 반환
초기화 블럭
- 클래스 필드의 초기화만을 담당하는 중괄호({})로 둘러싸인 블록
- 인스턴스 초기화 블록
- 중괄호({})만을 사용하여 정의
- 인스턴스가 생성될 때마다 실행
- 잘 쓰이진 않음 (생성자와 차이 없어서)
- 많은 생성자가 공통으로 수행해야될 코드가 있다면 사용함
- 클래스 초기화 블록
- 인스턴스 초기화 블록에 static 키워드를 추가
- 단 한번만 실행
- 복잡한 초기화를 해야 할 경우 유용하게 사용
- 순서
- 클래스 초기화 블록 > 메인메서드 > 인스턴스 초기화 블록 > 생성자
- 클래스 변수 : 기본값 → 명시적 초기화 → 클래스 초기화 블록
- 인스턴스 변수 : 기본값 → 명시적 초기화 → 인스턴스 초기화 블록 → 생성자
메서드
- 다른 객체와의 데이터 전달수단.
- 반환타입 메서드이름 (매개변수){}
- int add (int x, int y) { return x + y;}
- 매개변수의 갯수를 모를경우 (배열 이용)
- int sum(int[] values){...배열 요소들을 합하는 식...}
- int sum(int ... values){...동일...}
- ... 을 써서 값을 몇개인진 모르지만 많이 나열할 것이다! 를 알림.(리스트 나열)
- return; 메서드 실행 종료
- 반환타입 ← 반환값(return)이 없으면 void를 붙이면 됨
- 반환 값이 있을때는 변수에 대입해주면 됨 (변수 = 해당메서드 호출)
- 외부에서 호출할때: 객체 생성 -> 참조변수로 메서드 호출
- final 메서드는 오버라이딩을 할 수 없음
- 재귀호출 (메서드 내부에서 자신의 메서드를 한번 더 불러옴)
- 팩토리얼 공식
static int factorial(int n) { int result=0; if(n==1) result = 1; else result = n * factorial(n-1); //재귀호출 return result; } }
- 참조형/기본형 매개변수
- 메서드의 매개변수를 int a 이런식으로 자료형 a = 기본형 매개변수
- Data d 이런식으로 아예 참조형을 해주면 = 참조형 매개변수
- 클래스(static) 메서드
- 객체생성 없이 클래스.메서드() 로 호출 가능
- 인스턴스 변수/메서드 호출 불가능
- 인스턴스 메서드
- 객체생성 해야함. 참조변수.메서드() 로 호출함
- 인스턴스 변수/메서드 사용 가능
오버로딩
- 이름이 같은 메서드 정의
- 매개변수의 타입, 갯수 중 하나가 달라야 함
- 반환타입은 달라도 됨
오버라이딩
- 상속받은 조상의 메서드를 변경함 (선언부는 같게)
- class child extends parent {…}
생성자
- 인스턴스가 생성될 때마다 호출되는 인스턴스(객체) 초기화 메서드
- 리턴타입 X. 클래스 이름과 동일함
- 클래스 이름과 같아야함 (기본 생성자 무조건 있어야함!)
- 클래스에 public 이 붙으면 기본생성자에도 public이 붙음
- Car myCar = new Car() 할때 Car() 이 기본생성자임
- 객체를 생성해주는 역할
- final 멤버 변수 초기화
- 인스턴스 변수의 경우, 생성자 안에서 초기화 할 수 있음
- 생성자의 매개변수로 제공받아 필드의 final 상수를 한번만 초기화 할 수 있음
- this()
- 같은 클래스 내 다른 생성자 호출
- Car(){this(2,”yellow”)} → Car(int i, String s){} 생성자를 호출한것임
- 참조변수 this : 인스턴스 자신을 가리키는 참조변수
- 인스턴스 메서드 내에서만 사용 가능
- 싱글톤
- 단 하나의 객체만 만들도록 설정하는 것
- super()
- 조상의 생성자 호출
- 생성자의 첫줄에 다른 생성자를 호출하지 않으면
- super();
- 자손 클래스의 첫줄이 기본 생성자(조상의것 or 자손의것)를 호출하는 문장이 아닐 시,
- 컴파일러가 조상의 기본 생성자를 호출하는 코드를 넣음
- 참조변수 super : 조상의 멤버랑 자손의 멤버와 구별할 때 사용
- 인스턴스 메서드 내에서만 사용 가능
//싱글톤
public class 클래스이름 {
//클래스 내부에서 생성자 호출 가능. private static을 붙여 외부에서 필드값 변경 못하게함.
private static 클래스이름 singeleton = new 클래스이름();
//생성자. private를 붙여 하나의 객체만 생성 가능하도록 함
private 클래스이름() {};
//외부에서 호출 가능한 메서드. 오직 하나의 같은 객체를 호출하는법
static 클래스이름 getInstance() {
return singleton; //하나뿐의 객체를 반환해줌
}
}
'Java' 카테고리의 다른 글
[Java] 제네릭스 (0) | 2022.06.25 |
---|---|
[Java] 예외, 래퍼 클래스 (0) | 2022.06.25 |
[Java] 스레드 (0) | 2022.06.21 |
[Java] Object, String 클래스 (0) | 2022.06.21 |
[Java] 상속, 인터페이스 (0) | 2022.06.19 |