🧷 메소드
🧷 main() 메소드
🧷 변수 선언
: 클래스, 변수, 상수, 메소드 등에 붙이는 이름
🧷 기본 타입
🧷 레퍼런스 타입
:1개 (용도는 3가지)
=> 레퍼런스란 포인터와 비슷한 개념
🧷 System.in
🧷 Scanner 클래스
import java.util.Scanner; //import문 필요
...
Scanner a = new Scanner(System.in); //Scanner 객체 생성
🧷 같은 순위의 연산자
🧷 괄호는 최우선순위
🧷 ++, --
: 연산의 오른쪽 결과는 왼쪽 변수에 대입
int a=1, b=3;
a = b; //a=b=3
a += b; //a = a+b =3+3=6, b=3
🧷 비교 연산
: 두 피연산자를 비교하여 true 또는 false의 논리 값을 내는 연산
🧷 논리 연산
: 논리 값으로 NOT, OR, AND 논리 연산. 논리 값을 내는 연산
🧷 두 연산의 복합 사례
//나이가 20대인 경우
(age>=20) && (age<30)
//문자가 대문자인 경우
(c>='A') && (c<='Z')
//(x,y)가 (0,0)과 (50,50)의 사각형 내에 있음
(x>=0) && (y>=0) && (x<=50) && (y<=50)
//오류!
//20 <= age < 30
Condition ? opr2 : opr3
int s;
if(x>y)
s = 1;
else
s = -1;
🟰
int s = (x>y)?1:-1;
if (조건식) {
..실행 문장.. //조건식이 참인 경우
}
🧷 if-else 문
if (조건식) {
..실행 문장1..
}
else {
..실행 문장2..
}
🧷 다중 if-else 문
if (조건식1) {
실행문장1;
}
else if (조건식2) {
실행문장2;
}
else if (조건식m) {
...
}
else {
실행문장n;
}
🧷 switch문은 식과 case문의 값과 비교
switch (식) {
case 값1:
실행문장1;
break;
case 값2:
실행문장2;
break;
...
case 값m:
실행문장m;
break;
default:
실행문장n;
}
🧷 switch 문 내의 break 문
🧷 case 문의 값
오류!
switch(a) {
case a: //변수 사용 안됨
case a > 3: //수식 안됨
case a == 1: //수식 안됨
}
🧷 자바 반복문의 종류
🧷 for문의 구성
for(초기문; 조건식; 반복 후 작업) {
.. 작업문 ..
}
🧷 for문의 특이한 형태
for (초기작업; true; 반복후작업) { //반복조건이 true이면 무한 반복
}
for (초기작업; ;반복후작업) { //반복조건이 비어있으면 true로 간주, 무한 반복
}
//초기 작업과 반복후작업은 ','로 분리하여 여러 문장 나열 가능
for(i=0; i<10; i++,System.out.println(i){
..
}
//for문 내 변수 선언 가능
for(int i=0; i<10; i++) { //변수 i는 for문 내에서만 사용 가능
}
🧷 while문의 구성
while (조건식) {
..작업문..
}
🧷 do-while문의 구성
do {
..작업문..
} whlie (조건식);
🧷 continue문
🧷 break문
🧷 일차원 배열 만들기
int intArray[];
char charArray[];
int[] intArray;
char[] charArray;
intArray = new int[10];
charArray = new char[20];
//선언과 동시에 생성
int intArray[] = new int[10];
char charArray[] = new char[20];
int intArray[] = {0,1,2,3,4,5,6,7,8,9};
//초기화된 값의 개수만큼의 배열 생성
int intArray[10]; //배열 선언 시 크기를 지정하면 안돼!
🧷 배열 인덱스와 원소 접근
int intArray[] = new int[5]; //원소가 5개인 배열 생성
intArray[0] = 5;
intArray[3] = 6;
int n = intArrayp[3]; //원소 3의 값을 읽어 n에 저장 (n=6)
n = intArray[-2]; //오류! 인덱스로 음수 사용 불가
n = intArray[5]; //오류! 5는 인덱스 범위를 넘었음 (0~4)
int intArray[]; //배열 선언
intArray[] = 8; //오류! 생성되지 않은 배열 사용
🧷 레퍼런스 치환과 배열 공유
int intArray[] = new int[5];
int myArray[] = intArray; //레퍼런스 치환. myArray는 intArray와 동일한 배열 참조
🧷 배열의 크기, length 필드
int intArray[];
intArray = new int[5];
int size = intArray.length; //size = 5
🧷 배열과 for-each문
for (변수 : 배열레퍼런스) {
.. 반복작업문 ..
}
int n[] = {1,2,3,4,5};
int sum = 0;
for (int k : n) {
sum += k;
}
🟰
for(int i=0; i<n.length; i++) {
sum += n[i];
}
String names[] = {"사과", "배", "바나나", "체리", "딸기", "포도"};
for (String s : name) {
System.out.print(s+ " ");
}
>> 사과 배 바나나 체리 딸기 포도
enum Week {월, 화, 수, 목, 금, 토, 일}
for (Week day: Week.values())
System.out.print(day+ "요일 ");
>> 월요일 화요일 수요일 목요일 금요일 토요일 일요일
🧷 2차원 배열
int intArray[][];
char charArray[][];
double doubleArray[][];
int [][] intArray;
char [][] charArray;
double [][] doubleArray;
intArray = new int[2][5];
charArray = new char[5][5];
doubleArray = new double[5][2];
int intArray[][] = { {0,1,2}, {3,4,5}, {6,7,8} };
char charArray[][] = { {'a','b','c'} {'d','e','f'} };
double doubleArray[][] = { {0.01,0.02}, {0.03,0.04} };
🧷 비정방형 배열
: 각 행의 열의 개수가 다른 배열
🧷 비정방형 배열의 length
int i[][];
i = new int[4][];
i[0] = new int[1];
i[1] = new int[2];
i[2] = new int[3];
i[3] = new int[4];
🧷 배열 리턴 과정
🧷 main() 메소드
🧷 컴파일 오류
🧷 예외 (Exception)
🧷 예외 처리, try-catch-finally 문
try {
예외가 발생할 가능성이 있는 실행문
}
catch (처리할 예외 타입 선언){
예외 처리문
}
finally {
예외 발생 여부와 상관없이 무조건 실행되는 문장
}
//finally 블록은 생략 가능
🧷 자주 발생하는 예외
🧷 객체 지향 특성 : 캡슐화
🧷 클래스(class) : 객체 모양을 선언한 틀 (캡슐화)
🧷 객체
🧷 상속
💡 참고
: 자바는 클래스 다중 상속 없음. 인터페이스 다중 상속 허용
🧷 다형성
🧷 클래스 선언
🧷 필드와 메소드
🧷 필드의 접근 지정자, public
🧷 생성자
🧷 객체 생성
🧷 객체 생성 과정
🧷 객체의 멤버 접근
객체 레퍼런스.멤버
ex) pizza.radius = 10;
🧷 객체 생성과 접근
🧷 생성자 개념
: 객체가 생성될 때 초기화를 위해 실행되는 메소드
🧷 생성자 특징
1) 생성자는 메소드
2) 생성자 이름은 클래스 이름과 반드시 동일
public class Circle {
public Circle(int r, String n) { ... } //생성자
}
3) 생성자 여러 개 작성 가능 (오버로딩)
public class Circle {
public Circle() { ... } //매개 변수 없는 생성자
public Circle(int r, String n) { ... } //2개의 매개 변수를 가진 생성자
}
4) 생성자는 new를 통해 객체를 생성할 때, 객체당 한번 호출
Circle pizza = new Circle(10, "자바피자"); //생성자 Circle(int r, String n) 호출
Circle donut = new Circle(); //생성자 Circle() 호출
5) 생성자는 리턴 타입을 지정할 수 없음
public Circle() { ... } //리턴 타입 선언하지 않음
//리턴 값이 없다고 해서, void를 리턴 타입으로 지정하면 안됨!
public void Circle() {...} //오류!
6) 생성자의 목적은 객체 초기화
Circle pizza = new Circle(10, "자바피자"); //생성자 Circle(int r, String n) 호출
7) 생성자는 객체가 생성될 때 반드시 호출
- 하나 이상 선언되어야 함!
: 생성자를 작성하지 않았으면 컴파일러가 자동으로 기본 생성자 삽입
🧷 기본 생성자
: 매개 변수 없고 아무 작업 없이 단순 리턴하는 생성자 (=디폴트 생성자)
class Circle {
public Circle() { } //기본 생성자
}
public class Circle {
int radius;
void set(int r) { radius = r; }
double getArea() { return 3.14 * radius * radius; }
//public Circle() { } //컴파일러에 의해 자동 삽입된 기본 생성자
public static void main(String[] args) {
Circle pizza = new Circle();
pizza.set(3);
]
}
🧷 this 레퍼런스
public class Circle {
int radius;
public Circle(int r) {this.radius = r;}
public int getRadius() {return radius;}
}
🧷 this 레퍼런스의 필요성
🧷 this()로 다른 생성자 호출
💡 this 와 this()는 다름
- this : 객체 자신에 대한 레퍼런스. 메소드에서 사용 (static 메소드에서는 x)
- this() : 생성자가 다른 생성자 호출
🧷 객체 치환
🧷 객체 배열
: 객체에 대한 레퍼런스를 원소로 갖는 배열
Circle[] c; //Circle 배열에 대한 레퍼런스 변수 c 선언
c = new Circlr[5]; //레퍼런스 변수 생성
for (int i=0; i<c.length; i++) {
c[i] = new Circle(i); //배열의 각 원소 객체 생성
}
🧷 메소드 형식
🧷 인자 전달
경우 1. 기본 타입의 값 전달 : 값이 복사되어 전달
메소드의 매개변수가 변경되어도 호출한 실인자 값은 변경되지 않음
(매개변수가 byte, int, double 등 기본 타입의 값일 때)
경우 2. 객체 혹은 배열 전달
- 객체나 배열의 레퍼런스만 전달
- 객체 혹은 배열이 통째로 복사되어 전달되는 것이 아님
- 메소드의 매개변수와 호출한 실인자 객체나 배열 공유
🧷 메소드의 배열 리턴
🧷 메소드 오버로딩
class MethodOverloading {
public int getSum(int i, int j) {
return i+j;
}
public int getSum(int i, int j, int k) {
return i+j+k;
}
}
🧷 오버로딩된 메소드 호출
public class MethodSample {
public int getSum(int i, int j) {
return i+j;
}
public int getSum(int i, int j, int k) {
return i+j+k;
}
public double getSum(double i, double j) {
return i+j;
}
public static void main(String[] args) {
MethodSample a = new MethodSample();
int i = a.getSum(1,2);
int j = a.getSum(1,2,3);
double k =a.getSum(1.1,1.2);
System.out.println(i);
System.out.println(j);
System.out.println(k);
}
}
🧷 패키지
: 관련 있는 클래스 파일을 저장하는 디렉토리
🧷 접근 지정자
: 클래스나 멤버들을 다른 클래스에서 접근해도 되는지의 여부를 선언하는 지시어
🧷 클래스 접근 지정
🧷 멤버 접근 지정
🧷 non-static 멤버와 static 멤버
🧷 static 멤버의 생성과 활용 1 : 객체.static 멤버
class Ex {
public int n;
public void g() {
m = 20;
}
public void h() {
m = 30;
}
public static int m;
public static void f() {
m = 5;
}
}
public class StaticSample {
public static void main(String[] args) {
Ex s1,s2;
s1 = new Ex();
s1.n = 5;
s1.g();
s1.m = 50;
s2 = new Ex();
s2.n = 8;
s2.h();
s2.f();
System.out.println(s1.m);
}
}
>> 5
Ex s1,s2; //static 멤버 m, f()는 이미 존재, 사용 가능
//Ex 객체 생성
s1 = new Ex();
s2 = new Ex();
객체.static필드
객체.static메소드
s1.m = 50;
s2.f();
🧷 static 멤버의 생성 및 활용 2 : 클래스명.static 멤버
public class StaticEx {
public static void main(String[] args) {
Ex.m = 10;
Ex s1 = new Ex();
System.out.println(s1.m);
s1.f();
Ex.f();
}
}
🧷 static 메소드의 제약 조건
1) static 메소드는 static 멤버만 접근 가능
- non-static 멤버 접근할 수 없음
- non-static 멤버는 static 멤버 사용 가능
class StaticMethod {
int n;
void f1(int x) {n=x;} //정상
void f2(int x) {m=x;} //정상
static int m;
staic void s2(int x) {n=x;} //오류! static 메소드는 non-static 필드 사용 불가
static void s2(inr x) {f1(3);} //오류! static 메소드는 non-static 메소드 사용 불가
static void s3(int x) {m=x;} //정상. static 메소드는 static 필드 사용 가능
static void s4(int x) {s3(3);} //정상. static 메소드는 static 메소드 호출 가능
}
2) static 메소드는 this 사용 불가
- static 메소드는 객체 없이도 존재하기 때문에, this 사용 불가
class StaticAndThis {
int n;
static int m;
void f1(int x) {this.n = x;}
void f2(int x) {this.m = x;}
static void s1(int x) {this.n = x;} //오류!
static void s2(int x) {this.m = x;} //오류!
}
🧷 final 클래스, 메소드, 필드
🧷 객체 지향의 상속
🧷 상속의 특징
🧷 상속과 접근 지정자
🧷 **서브 클래스 / 슈퍼 클래스의 생성자 호출 및 실행
정리가 깔끔하네요 ㅎㅎ 잘 보고가요 :)