// 배열 선언
int[] intArray;
char[] charArray;
// 배열 생성
int[] intArray = new int[10];
char[] charArray = new char[20];
// 배열 초기화
int[] intArray = { 1, 2, 3, 4, 5 }
for(int i=0; i < intArray.length; i++) {
System.out.print(intArray[i] + " ");
}
import java.util.Arrays;
...
System.out.println(Arrays.toString(intArray));
for(int value: intArray) {
System.out.println(value + " ");
}
int[][] intArray;
char[][] charArray;
double[][] doubleArray;
int[][] intArray = new int[2][5];
char[][] charArray = new char[5][5];
double[][] 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}}
import java.util.ArrayList;
...
ArrayList<Integer> arrayList1 = new ArrayList<>();
ArrayList<String> arrayList2 = new ArrayList<>();
ArrayList<Double> arrayList3 = new ArrayList<>();
try {
// 예외가 발생할 가능성이 있는 실행문(try 블록)
}
catch (처리할 예외 타입 선언) {
// 예외 처리문 (catch 블록)
}
finally {
// 예외 발생 여부와 상관없이 무조건 실행되는 문장 (finally 블록)
// (finally 블록은 생략 가능)
}
try {
int num1 = 4;
int num2 = 0;
System.out.println(num1 + " / " + num2 + " = " + (num1/num2));
}
catch (ArithmeticException e) {
System.out.println("0으로 나누어 예외가 발생했습니다.");
}
System.out.println("여기까지 읽힐까?");
필요한 데이터와 코드를 묶어 하나의 객체로 만들고 이 객체들 간에 상호작용을 하도록 프로그램을 만드는 방식 → OOP (Object Oriented Programming)
물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것
절차지향 프로그래밍
- ex. C언어
- 장점
- 실행 속도가 빠름 → 코드가 기술 순서대로 실행되어 컴퓨터 처리 구조와 비슷하기 때문
- 단점
- 프로그램이 커진다면 유지보수 어려움
- 순서가 바뀌면 결과 도출의 어려움
- 대형 프로젝트에 적합하지 않음
사용자가 정의하는 자료형이라 생각하면 쉬움!
// 클래스 선언
public class 클래스명 { ... }
// 객체 생성
// new 연산자 : 객체의 주소 리턴
클래스명 변수 = new 클래스명();
public class Main {
public static void main(String[] args) {
ClassName test = new ClassName();
}
}
// 공개 클래스 선언
// 클래스명은 첫 글자가 대문자인 CamelCase
public class ClassName {
// 필드(변수)
public int number;
public String name;
// 메소드 - 생성자
public ClassName(){
}
// 메소드
public String getName() {
return name;
}
}
공개 클래스란?
- 어느 위치에 있든지 패키지와 상관없이 사용 가능한 클래스
// 필드 선언
자료형 필드명 [= 초기값];
int name; // 필드 선언
name = '아이오닉 6'; // 필드 사용
// 외부 객체
Car c1 = new Car(); // 객체 생성 후
c1.name = "아이오닉6"; // dot 연산자를 이용해 필드 접근
public void test() {
System.out.print("test 메소드");
}
public class ClassName {
public ClassName(){} // 생성자
}
package 상위패키지.하위패키지;
public class 클래스명 { ... }
접근 제어자의 목적
종류
public
protected
default → 접근 제한자가 붙지 않은 상태
private
- 같은 클래스에서만 접근 가능
getter : 필드 값을 가져올 때
setter : 필드 값을 설정할 때
public class Person {
private int age;
private String name;
public Person(String name) {
this.name = name;
}
// getter
public int getAge() {
return age;
}
// setter
public void setAge(int age) {
this.age = age;
}
// getter
public int getName() {
return name;
}
// setter
public void setName(String name) {
this.name = name;
}
}
Person codee = new Person("코디");
codee.setAge(1);
System.out.println(codee.getName());
public class SomeClass {
// 정적 필드
static 타입 필드명 [= 초기값];
// 정적 메소드
static 리턴타입 메소드명 (매개변수1, 매개변수2, ...) { ... }
}
final 타입 필드 [=초기값];
static final 타입 상수 [=초기값];
static final double PI = 3.141592;
static final String HELLO_WORLD = "Hello, World!";
부모 클래스에서 정의된 필드와 메소드를 자식 클래스가 물려받는 것
public class Person {
...
}
public class Researcher extends Person { // Person을 상속받는 Researcher 선언
...
}
public class Professor extends Researcher { // Researcher를 상속받는 Professor 선언
...
}
public class Student extends Person { // Person을 상속받는 Student 선언
...
}
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Student extends Person {
private String school;
public Student(int age, String name) {
// 상속으로 부모 클래스의 멤버에 접근 가능!
setAge(age);
setName(name);
}
public String getSchool() {
return school;
}
public void setSchool(String schoool) {
this.school= school;
}
}
Student stu = new Student(20, "새싹");
stu.setSchool("새싹 대학교");
// 자식 클래스의 생성자
public Student(...) {
super();
// 또는
super(매개변수1, ... );
// ...
}
public class Person {
private int age;
private String name;
public Person(String name) {
setName(name);
}
...
public void setName(String name) {
this.name = name;
}
}
public class Student extends Person {
private String school;
public Student(int age, String name) {
super(name) // 서브 클래스 첫 줄에서 super() 사용
setAge(age);
}
...
}
슈퍼 클래스의 메소드를 서브 클래스에서 재정의하는 것!
컴파일 시 정확히 오버라이딩 되었는지 확인하는 어노테이션으로 생략 가능
// Person 클래스
public void printName(){
System.out.println("익명");
}
// Student 클래스
@Override
public void printName(){
System.out.println(getName());
}
오버로딩 VS 오버라이딩
- 오버로딩은 동일한 함수명에 매개변수의 차이를 두어 알아서 알맞는 함수를 찾아가도록 하는 것
- 오버라이딩은 이미 정의된 함수의 내부 코드를 수정하여 재정의하는 것
추상 : 실체 간의 공통되는 특성
하나 이상의 추상 메소드(선언만 있고, 구현되지 않은 메소드)를 포함하는 클래스
Shape shape = new Shape(); // 불가능!
public abstract class Person {
private int age;
private String name;
...
abstract public void printName();
}
// Student Class
public void printName() {
System.out.println("학생" + getName());
}
인터페이스(interface) 사전적 의미
- 두 장치를 연결하는 접속기
→ 인터페이스는 두 객체를 연결하는 역할을 함!
추상 메소드의 모음 → 여러 구현체에서 공통적인 부분을 추상화하는 역할
추상 클래스와 다른 점
- 추상 클래스는 추상 메소드가 없어도 상관 X
- 인터페이스에는 추상 메소드가 무조건 있어야 함
- 메소드 구현 X, 추상 메소드만 존재
interface 인터페이스명 { ... } // default 접근 제한
public interface 인터페이스명 { ... } // public 접근 제한
// 인터페이스 선언
public interface Phone {
public final String CATEGORY = "phone"; // public final 생략 가능
public abstract void sendCall(); // public abstract 생략 가능
public abstract void receiveCall();
public abstract void sendMessage();
public abstract void receiveMessage();
}
// 인터페이스 구현
public class Samsung implements Phone {
public boolean silence = false;
@Override // 부모 클래스에 있는 메서드를 Override 했다는 것을 명시적으로 선언 (주석과 비슷)
public abstract void sendCall() {
if(!silence) System.out.println("뚜루루 뚜루루");
};
@Override
public abstract void receiveCall() {
if(!silence) System.out.println("전화 받아");
};
@Override
public abstract void sendMessage() {
if(!silence) System.out.println("슉");
};
@Override
public abstract void receiveMessage() {
if(!silence) System.out.println("문자 왔숑");
};
}