Java 12일차
- StringBuilder 클래스
- 중첩 클래스
- Thread
StringBuilder 클래스(가변 객체)
StringBuilder 참조변수 = new StringBuilder("문자열");
- String 클래스와 같이 문자열을 다루는 클래스
- String 클래스는 문자열을 인스턴스로 생성하고 나면 인스턴스가 가진 문자열을 변경하지 못하는 단점을 보완한 클래스
- 같은 인스턴스 안의 문자열 필드 값을 추가하거나 변경할 수 있도록 되어 있음
- 원본 문자열을 바꿀 수 있는 만큼 문자열을 다루는 메소드도 많이 포함
중첩 클래스
- 내부 클래스(Inner class)
- 클래스 또는 메소드 안에 또 다른 클래스를 만드는 것
- 내부 클래스는 외부 클래스의 모든 멤버를 자신의 멤버처럼 사용(private 멤버 접근 가능)
- static 내부 클래스를 제외한 내부 클래스는 항상 외부 클래스 객체를 통해서 생성
class Outer{
private int num1 = 10;
public void method1(){
System.out.println("num1 : " + num1);
}
public void printInner(){
Inner inner = new Inner();
inner.method2();
}
class Inner { // Inner class : 클래스 안에 클래스
private int num2 = 20;
public void method2(){
System.out.println("Inner.num1 : " + num1);
System.out.println("Inner.num2 : " + num2);
}
}
}
public class InnerClass1 {
public static void main(String[] args) {
Outer outer = new Outer();
outer.method1();
Outer.Inner inner = outer.new Inner(); // 바깥쪽 클래스가 존재해야 이게 생성될 수 있다.
inner.method2();
outer.printInner();
}
}
- 로컬 클래스(Local class)
- 메소드 안에서 정의된 클래스(메소드 안에서만 사용할 수 있음)
- 외부 클래스의 모든 멤버에 접근 가능(Private 멤버도 접근 가능)
- 지역 변수는 접근할 수 없지만, final로 선언된 상수는 접근 가능
/*
로컬 클래스 예제
*/
public class LocalClass1 {
private int num1 = 10;
public void method1(){
int num2 = 30;
class Local {
private int num3 = 30;
public void method2(){
System.out.println("num1 : " + num1);
System.out.println("num2 : " + num2);
System.out.println("num3 : " + num3);
}
}
Local local = new Local();
local.method2();
}
public static void main(String[] args) {
LocalClass1 localClass1 = new LocalClass1(); // 객체 생성
localClass1.method1();
}
}
- static 클래스(static class)
- 내부 클래스가 static으로 정의
- 정적 중첩 클래스 또는 static 클래스라고 부름
/*
static 클래스 예제
*/
public class StaticClass1 {
static class Cal{
int num = 0;
public void plus(){
num++;
}
}
public static void main(String[] args) {
StaticClass1.Cal cal = new StaticClass1.Cal();
cal.plus();
System.out.println(cal.num);
}
}
- 익명 클래스(anonymous class)
- 클래스를 정의하지 않고 객체를 정의할 때 사용
- 1회용 클래스이므로 재활용이 불가능
interface Inter1{ // 인터페이스는 뭔가 만들기 위해 틀을 설계 해놓은것
void method1();
}
class TestClass1 implements Inter1{
@Override
public void method1() {
System.out.println("Inter1을 구현한 클래스"); // 오버라이드를 시켜 구현을 해줌
}
}
interface Inter2{
String method2(); // 추상메소드가 반환형이 String 이름이 메소드
}
class TestClass2 implements Inter2{
@Override
public String method2() {
return "실명 클래스!"; // 일반적으로 쓸때 TestClass2를 쓸때 메소드 리턴
}
}
class TestClass3{
public void method3(Inter2 inter2){ // 매개변수가 Inter2라는 타입으로 객체를 넣어줘야 한다.
System.out.println(inter2.method2()); // 오버라이드된 메소드 사용
}
}
public class Anonumous2 {
public static void main(String[] args) {
TestClass2 testClass2 = new TestClass2();
TestClass3 testClass3 = new TestClass3(); // 객체 생성
testClass3.method3(testClass2); // 매개변수가 무조건 inter2타입으로 만들어진 객체가 필요.
// 이게 지금까지 배웠던 일반적인 방법
// 익명 클래스 시작!(아주 아주 중요)→ 이거 모르면 자바 모르는거
testClass3.method3(new TestClass2(){ // 일회용으로 만들어서 넣어주겟다. 굳히 참조변수만들지 않고 바로 객체를 만들어서 사용
// Test2사용하려면 inter2가 필요
@Override
public String method2() { // 오버라이드를 재구현
return "익명 객체";
}
/*
왜 이렇게 쓰는가?
- 꼭 구현해야 하는 인터페이스 메소드를 강제성있게 만들어 놓음.(인터페이스를 구현하도록)
- 미리 준비되어있으나 비어있다. 채워서 사용
*/
});
}
}
Thread
- 하나의 프로세스 내부에서 독립적으로 실행되는 작업 단위
- 운영체제에 의해 관리되는 하나의 작업 혹은 Task를 의미
- JVM에 의해 하나의 프로세스가 발생, main() 안에 실행문들이 하나의 스레드
- main() 외에 또 다른 스레드를 만들려면 Thread 클래스를 상속하거나 Runnable 인터페이스를 구현함
- 다중 스레드 작업 시에는 각 스레드끼리 정보를 주고 받을 수 있어 처리 과정의 오류를 줄일 수 있음
- 프로세스끼리는 정보를 주고 받을 수 있음
멀티 스레딩
- 여러 스레드를 동시에 실행 시키는 응용 프로그램을 작성하는 기법
- 메모리 공유로 인한 시스템 자원 소모가 줄어듦
- 동시에 두가지 이상의 활동이 가능하며, 서로 자원을 소모하다가 충돌이 일어날 가능성이 있다.
- 코드가 난해해질 가능성이 있다.
Thread의 생성주기
- Runnable : 스레드가 실행되기 위한 준비 단계
- Running : 스케줄러에 의해 선택된 스레드가 실행되는 단계
- Blocked : 스레드가 작업에 완수하지 못하고 잠시 작업을 멈추는 단계
Author And Source
이 문제에 관하여(Java 12일차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@soyounjeong/Java-12일차저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)