백정탈의 개발 블로그
JAVA 공부 1일차 본문
http://www.tcpschool.com/java/intro
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
자바 공부 1일차
예전에 한 TCP스쿨을 통해서 공부 다시 복습 시작
변수
- 정수형 : byte, short, int, long
- 실수형 : float, double
- 문자형 : char, string
- 논리형 : boolean
상수(constant)
상수는 변수와 마찬가지로 이름을 가지고 있는 메모리 공간으로, 이러한 상수는 선언과 동시에 반드시 초기화해야 합니다.
final int AGES = 30; // AGES는 30으로 고정
리터럴(literal)
리터럴(literal)이란 그 자체로 값을 의미하는 것입니다.
즉, 변수와 상수와는 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않습니다.
삼항 연산자(ternary operator)
물음표(?) 앞의 조건식에 따라 결괏값이 참(true)이면 반환값1을 반환하고, 결괏값이 거짓(false)이면 반환값2를 반환합니다.
int num1 = 5, num2 = 7;
int result;
result = (num1 - num2 > 0) ? num1 : num2; //삼항연산자 (num1-num2>0) true이면 왼쪽 num1을 false이면 오른쪽 num2를 대입한다
System.out.println("두 정수 중 더 큰 수는 " + result + "입니다.");
instanceof 연산자
instanceof 연산자는 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 반환해 줍니다.
즉, 해당 객체가 어떤 클래스나 인터페이스로부터 생성되었는지를 판별해 주는 역할
class A {}
class B extends A {}
public static void main(String[] args) {
A a = new A();
B b = new B();
System.out.println(a instanceof A); // true
System.out.println(b instanceof A); // true
System.out.println(a instanceof B); // false
System.out.println(b instanceof B); // true
}
Enhanced for 문
이 반복문은 배열에 주로 사용
int[] arr = new int[]{1, 2, 3, 4, 5};
for (int e : arr) {
System.out.print(e + " "); //1 2 3 4 5
}
Enhance for 문에서 배열 요소의 값을 변경하여도 원본 배열에는 아무런 영향을 주지 못함 참조용으로만 사용
생성자(constructor)
자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공합니다. 자바에서 생성자(constructor)의 이름은 해당 클래스의 이름과 같다
특징
1. 생성자는 반환값이 없지만, 반환 타입을 void형으로 선언하지 않습니다.
2. 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있습니다.
3. 객체를 초기화하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있습니다.
즉, 생성자도 하나의 메소드이므로, 메소드 오버로딩이 가능하다는 의미입니다.
this() 메소드
this() 메소드는 생성자 내부에서만 사용할 수 있으며, 같은 클래스의 다른 생성자를 호출할 때 사용합니다. this() 메소드에 인수를 전달하면, 생성자 중에서 메소드 시그니처가 일치하는 다른 생성자를 찾아 호출해 줍니다.
class Car {
private String modelName;
private int modelYear;
private String color;
private int maxSpeed;
private int currentSpeed;
Car(String modelName, int modelYear, String color, int maxSpeed) {
this.modelName = modelName;
this.modelYear = modelYear;
this.color = color;
this.maxSpeed = maxSpeed;
this.currentSpeed = 0;
}
Car() {
this("소나타", 2012, "검정색", 160); // 다른 생성자를 호출함.
}
public String getModel() {
return this.modelYear + "년식 " + this.modelName + " " + this.color;
}
}
public class Method05 {
public static void main(String[] args) {
Car tcpCar = new Car(); System.out.println(tcpCar.getModel());
}
}
2012년식 소나타 검정색
메소드 오버로딩(method overloading)
메소드 오버로딩(overloading)이란 같은 이름의 메소드를 중복하여 정의하는 것을 의미합니다.
자바에서는 원래 한 클래스 내에 같은 이름의 메소드를 둘 이상 가질 수 없습니다.
하지만 매개변수의 개수나 타입을 다르게 하면, 하나의 이름으로 메소드를 작성할 수 있습니다.
즉, 메소드 오버로딩은 서로 다른 시그니처를 갖는 여러 메소드를 같은 이름으로 정의하는 것이라고 할 수 있습니다.
1. 메소드의 이름이 같아야 합니다.
2. 메소드의 시그니처, 즉 매개변수의 개수 또는 타입이 달라야 합니다.
필드의 구분
1. 클래스 변수(static variable): 초기화를 하지 않아도 변수의 타입에 맞게 자동으로 초기화될 것입니다. Static 키워드 가지고 있다. 공유 변수(shared variable)라고도 합니다.
2. 인스턴스 변수(instance variable): 초기화를 하지 않아도 변수의 타입에 맞게 자동으로 초기화될 것입니다. 인스턴스마다 가져야 하는 고유한 값을 유지하기 위해 사용됩니다.
3. 지역 변수(local variable): 무조건 초기화를 해야함
메소드의 구분
1. 클래스 메소드(static method): static 키워드를 가지는 메소드, 클래스 변수와 마찬가지로 인스턴스를 생성하지 않고도 바로 사용할 수 있습니다.
2. 인스턴스 메소드(instance method): 인스턴스를 무조건 생성해야 사용가능하다.
필드의 초기화
1. 명시적 초기화: 지역 변수를 초기화하는 방법과 마찬가지로 필드를 선언과 동시에 초기화
2. 생성자를 이용한 초기화: 객체의 생성과 동시에 필드를 초기화하는 방법, 생성자를 이용한 초기화는 인스턴스를 생성할 때까지 필드를 초기화
3. 초기화 블록을 이용한 초기화: 클래스 필드의 초기화만을 담당하는 중괄호({})로 둘러싸인 블록
1. 인스턴스 초기화 블록: 단순히 중괄호({})만을 사용하여 정의
2. 클래스 초기화 블록: 인스턴스 초기화 블록에 static 키워드를 추가하여 정의, 초기화 블록은 클래스가 처음으로 메모리 에 로딩될 때 단 한 번만 실행
class InitBlock {
static int classVar; // 클래스 변수
int instanceVar; // 인스턴스 변수
static { // 클래스 초기화 블록을 이용한 초기화
classVar = 10;
}
}
public class Member04 {
public static void main(String[] args) {
System.out.println(InitBlock.classVar); // 클래스 변수에 접근
}
}
필드의 초기화 순서
1. 클래스 변수 : 기본값 → 명시적 초기화 → 클래스 초기화 블록
2. 인스턴스 변수 : 기본값 → 명시적 초기화 → 인스턴스 초기화 블록 → 생성자
class InitBlock {
static int classVar = 10; // 클래스 변수의 명시적 초기화
int instanceVar = 10; // 인스턴스 변수의 명시적 초기화
static { classVar = 20; } // 클래스 초기화 블록을 이용한 초기화
{ instanceVar = 20; } // 인스턴스 초기화 블록을 이용한 초기화
InitBlock() { instanceVar = 30; } // 생성자를 이용한 초기화
}
public class Member05 {
public static void main(String[] args) {
System.out.println(InitBlock.classVar);
InitBlock myInit = new InitBlock();
System.out.println(myInit.instanceVar);
}
}
20
30
super 키워드
부모 클래스의 생성자를 호출
부모 클래스인 Parent 클래스에는 기본 생성자가 추가되어 있어야 사용가능
class Parent {
int a;
Parent() { a = 10; }
Parent(int n) { a = n; }
}
class Child extends Parent {
int b;
Child() {
① super(40);
b = 20;
}
void display() {
System.out.println(a);
System.out.println(b);
}
}
public class Inheritance04 {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
}
}
40
20
추상 클래스(abstract class)
자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는
abstract class 클래스이름 {
...
abstract 반환타입 메소드이름();
...
}
인터페이스(interface)
1. 인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스
2. 다중 상속이 가능하다
3. 인터페이스의 모든 필드는 public static final이어야 하며, 모든 메소드는 public abstract이어야 함
interface Animal { public abstract void cry(); }
interface Pet { public abstract void play(); }
class Cat implements Animal, Pet {
public void cry() {
System.out.println("냐옹냐옹!");
}
public void play() {
System.out.println("쥐 잡기 놀이하자~!");
}
}
class Dog implements Animal, Pet {
public void cry() {
System.out.println("멍멍!");
}
public void play() {
System.out.println("산책가자~!");
}
}
public class Polymorphism04 {
public static void main(String[] args) {
Cat c = new Cat();
Dog d = new Dog();
c.cry();
c.play();
d.cry();
d.play();
}
}
냐옹냐옹!
나비야~ 쥐 잡기 놀이하자~!
멍멍!
바둑아~ 산책가자~!
내부 클래스(inner class)
하나의 클래스 내부에 선언된 또 다른 클래스
class Outer { // 외부 클래스
...
class Inner { // 내부 클래스
...
}
...
}
1. 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있게 됩니다.
2. 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킵니다.
3. 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 줄일 수 있습니다.
'자바' 카테고리의 다른 글
JAVA 공부 3일차 (0) | 2022.10.13 |
---|