자바를 공부해 보자

[중첩 클래스 및 상속, 다형성, 추상화, 인터페이스] 상속

자바

상속

 

1) 개요

 

상속이란?

*기존 클래스를 재 사용하여 새로운 클래스를 작성

*두 클래스를 부모와 자식으로 관계를 맺어주는

*자손은 부모의 모든 멤버를 받아옴

*키워드는 extends

 

 

 

 

(extends Object) 상속, 생략이 되어 있는 것

 

 

2) Object class

조상이 없는 클래스

*모든 클래스는 Object클래스를 직.간접적으로 상속

*모든 클래스의 최고 조상

 

 

 

메소드

 

 

 

 

 

에러 안나고 출력이 잘 됨

extends Object가 생략되어 있기 때문에

ap = 참조변수, 주소를 가지는 변수

 

 

int a=10;

 

힙-> 가비지 컬렉터

 

 

 

(5분부터 다시 들을 것)

(17분 시작)

 

 

07. super, super 메소드

 

1)this

객체 자신을 가리키는 참조변수

객체의 주소가 저장되어 있으며 숨겨진 채로 존재

 

2)super

조상의 멤버와 자신의 멤버를 구별하는데 사용되는 키워드 , this와 같음

 

 

3)super메소드

*조상의 멤버의 초기화를 위해 조상클래스의 생성자를 호출하기 위해 만든 메소드

*반드시 자식생성자의 첫 문장에서 호출해야

(super, this 둘 중 하나만 사용해야 한다.)

 

 

parent멤버와 child멤버가 겹쳤을 떄, parent멤버에 super 키워들 붙힌다.

 

 

 

 

 

 

 

 

[중첩클래스 및 상속, 다형성, 추상화, 인터페이스] 중첩클래스의 개요 및 종류

자바

1. 중첩클래스의 개요 및 종류

 

 

(1) 개요

하나의 클래스 내부에 또 다른 클래스를 사용 하는 것

 

종류

일반, 정적, 지역, 익명(무명) 클래스

static / 지역변수

 

자바 안에 들어가는 구성 요소!

 

class A {

//멤버 필드

 

int a;

//생성자

 

A(){}

//멤버메소드

 

class B{

}

//중첩클래스

 

public void disp(){

 

 

 

 

2) 일반 중첩 클래스

 

일반 멤버 필드와 접근 방법이 동일

 

외부 클래스의 객체가 반드시 필요

 

내부에서 클래스의 사용이 빈번할 때 사용

 

 

 

 

 

 

 

3) 정적 중첩 클래스

static

 

*static메소드와 접근 방법이 동일            // static 멤버만 사용가능

*외부 클래스의 객체가 필요하지 않음

*인터페이스의 멤버로 사용이 가능함

 

 

 

 

 

static -> 객체생성 필요없음 , 클래스 이름으로 생성이 가능하다.

 

 

 

 

 

 

 

outer2$Inner2.class

 

$ -> 중첩클래스구나..

 

 

 

 

4) 지역중첩클래스 -> 지역변수(매개변수)

 

 

 

other3$1Inner3

other3$2Inner3

 

 

지역구분해주는 숫자/인덱스 번호

 

 

 

5) 익명(무명)중첩클래스 -> GUI구현

 

 

 

 

Exam_04$1.class

 

 

 

 

 

 

 

package ch08;
class Outer1{
 private int a;
 private static int b;
 static {
  b=20;
 }
 Outer1(){
  a=10;
 }
 public void disp() {
  System.out.println("a="+a);
  System.out.println("b="+b);
  //System.out.println("c="+Inner1.class); //아예 불가함
 }
 class Inner1{
  private int c;
  Inner1(){
   c =30;
  }
  public void disp2() {
   System.out.println("a="+a);
   System.out.println("b="+b);
   System.out.println("c="+c);
  }
  class Inner1_Inner1{}
 }
 
}
public class Exam_01 {
 public static void main(String[] args) {
  Outer1 ot =new Outer1();
  Outer1.Inner1 oi = ot.new Inner1();
  oi.disp2();
  
 }
}

 

 

-----------------------

a=10
b=20
c=30

 

 

 

---------------------

 

 

---------------------------

 

 

 

 

 

 

package ch08;
class Outer2{
 private int a;
 private static int b;
 static {
  b=20;
 }
 Outer2(){
  a=10;
 }
 public void disp() {
  System.out.println("a="+a);
  System.out.println("b="+b);
  
 }
 static class Inner2{
  private int c;
  Inner2(){
   c =30;
  }
  public void disp2() {
   //System.out.println("a="+a);
   System.out.println("b="+b);
   System.out.println("c="+c);
  }
  
 }
 
}
public class Exam_02 {
 public static void main(String[] args) {
  Outer2 ot = new Outer2();
  Outer2.Inner2 oi = new Outer2.Inner2();
  oi.disp2();
  
 }

}

 

----------------------------------

 

 

b=20
c=30

----------------

 

 

 

------------------

 

package ch08;
class Outer3{
 private int a;
 private static int b;
 static {
  b=20;
 }
 Outer3(){
  a=10;
 }
 public void disp() {
  class Inner3{
   private int c;
   Inner3(){
    c = 30;
   }
   public void disp_in() {
    System.out.println("a="+a);
    System.out.println("b="+b);
    System.out.println("c="+c);
   }
  }
  Inner3 in = new Inner3();
  in.disp_in();
 }
}
public class Exam_03 {
 public static void main(String[] args) {
  Outer3 ot = new Outer3();
  ot.disp();
 }

}

 

--------------------------

 

a=10
b=20
c=30

------------------

 

 

 

 

package ch08;
class Outer4{
 public void aaa() {
  System.out.println("aaa메소드");
 }
 public void bbb() {
  System.out.println("bbb메소드");
 }
}
public class Exam_04 {
 public static void main(String[] args) {
  Outer4 ot = new Outer4() {
   public void bbb() {
    System.out.println("안녕하세요bbb메소드입니다");
   }
  };
  
  ot.bbb();
 }

}

 

======================

 

 

출력값: 안녕하세요bbb메소드입니다

 

-----------------------

 

 

 

 

 

메소드를 오버라이드해서 올리겠다.

인터페이스를 활용한 방법

 

 

 

익명중첩페이스

 

 

 

 

 

[중첩클래스 및 상속, 다형성, 추상화, 인터페이스] 클래스기초2

자바

클래스기초2

 

1) 접근제한자

접근을 목적으로 하는 단어

 

 

종류

private , package(default) , protexted , public

 

왜 접근을 제한해야 하는가?

 

예시, 커피자판기가 잠겨있지 않다면?

자판기 주인이 생각하는 대로 사람들이 행동하지 않으므로 장사에 차질이 생기게 됨!

 

 

 

접근허용자

[1]private (내부에서만 접근가능, 멤버끼리만 접근)

*해당 클래스 안의 멤버에서만 접근이 가능

*외부객체에서는 절대로 접근을 할 수 없음

*멤버의 은닉화를 시킬 때 사용 -> 은닉, 감추는게 은닉,

*거의 대부분의 멤버필드에 적용

 

 

[2]default

*접근제한자를 명시하지 않은 경우에는 디폴트 접근제한자가 생김

*같은 패키지(폴더)내의 클래스들은 접근을 허용하고, 다른 곳에서는 접근 불가

 

[3] protected

*클래스 멤버를 자신과 같은 패키지(폴더), 상속받은 클래스에서만 접근을 허용

*상속 받는 클래스가 다른 패키지여도 상관없음

 

상속관계클래스 = > public

상속관계아닌 클래스 => private

 

 

[4]public

*다른 클래스에서 해당 멤버를 사용할 수 있음

*보통 멤버 메소드, 생성자에 사용을 함

 

접근 허용자

 

멤버필드 private

 

2) 접근 허용 범위

 

 

 

public > private

 

 

3)은닉화

멤버필드(변수)를 다른 곳에서 직접 접근 못하게 함

*멤버에 접근을 못하게 하기 위해 private을 사용

*접근을 하기 위해 접근 메소드를 만들어 줌

*값을 설정할 때는 sette메소드,

값을 가져올 때는 getter메소드를 사용함

*보통 멤버필드 값을 은닉화해서 값을 보호하는데 이용

 

 

package aaa;


class Sung{
 String name;
 int kor;
}
public class DSD {
 public static void main(String [] args) {
  Sung s = new Sung();
  s.name ="홍길동";
  s.kor = 1000;
 }

}

 

--------------------

 

 

 

package aaa;


class Sung{
 private String name;
 private int kor;
 public Sung(String name) {
  this.name = name;
 }
 public void setKor(int kor) {
  if(kor<0 || kor>100) return;
  this.kor = kor;
 }
 public int getKor();{
 return kor;

}
 public String getName() {
  return name;
 }
}
public class DSD {
 public static void main(String [] args) {
  Sung s = new Sung();
  s.name ="홍길동";
  //이름을 바꿀수 없다
  s.kor = 1000;
  //국어값을 직접 바꿀 수 없다
  s.setKor(1000);
  //값의 범위가 벗어나 입력이 안된다
 }

}

 

캡슐화 되었다.

------------------------------------------

 

 

package aaa;
import java.io.*;
import java.util.Scanner;

class SungJuk{
 private String name;
 private int kor,eng, mat;
 private int tot,rank;
 
 public void setName(String name) { //매개변수 반드시 하나 존재 //set 하고 필드명, 필드명은 대문자가 셋업메소드임
  this.name = name;
 }
 public boolean setKor(int kor) {
  if ( kor<0 || kor>100) return false;
  this.kor = kor;
  return true;
 }
 public boolean setEng(int eng) {
  if ( eng<0 || eng>100) return false;
  this.eng = eng;
  return true;
 }public boolean setMat(int mat) {
  if ( mat<0 || mat>100) return false;
  this.mat = mat;
  return true;
 }
 public void sumTot() {
  tot = kor +eng +mat;
  
 }
 public int getTot() {
  return tot;
 }
 public void clearRank() {
  rank =1;
 }
 public void plusRank() {
 
 rank++;
}
 public void disp() {
  System.out.print(name+"\t");
  System.out.print(kor+"\t");
  System.out.print(eng+"\t");
  System.out.print(mat+"\t");
  System.out.print(tot+"\t");
  System.out.print(rank+"\t");
 }
}

public class Exam_07s {
 public static void main(String [] args) {
  System.out.print("인원수를 입력:");
  Scanner sc = new Scanner(System.in);
 
  int inwon = sc.nextInt();
 
 SungJuk sj[] = new SungJuk[inwon];
 for (int i = 0 ; i <inwon ; ++i) {
  sj[i] =new SungJuk();
  System.out.print("이름을 입력:");
  sj[i].setName(sc.next());
  do {
   System.out.print("국어점수를 입력:");
  }while(!sj[i].setKor(sc.nextInt()));
  do {
   System.out.print("영어점수를 입력:");
   }while(!sj[i].setEng(sc.nextInt()));
  do {
   System.out.print("수학점수를 입력:");
  }while(!sj[i].setMat(sc.nextInt()));
  
  sj[i].sumTot();
  sj[i].clearRank();
   }
 for (int i =0 ; i<inwon ; ++i) {
  for(int j=0 ; j<inwon ; ++j) {
   if(sj[i].getTot() <sj[j].getTot()) sj[i].plusRank();

  }
 }
 System.out.print("이름\t국어\t영어\t수학\t총점\t순위\n");
 for (int i=0; i<inwon;i++) {

  sj[i].disp();
 }
 }
}

 

 

-----------------------------------------------

 

4)지정예약어

멤버나 클래스의 성질을 지정하는 단어

 

종류 : static , final, static , final, transient, abstract, synchronized, native

 

 

 

 

 

 

 

 

[1] static (공통의, 공용의)

*하나의 클래스로 발생된 모든 객체가 공유하는 필드를 선언할 때 사용

*클래스 명으로 접근

*메모리에 프로그램 시작 후 바로 올라감

*메소드에 선언이 되면 static멤버만 사용 가능

 

 

 

-> 메소드 파트 다시 보기 ㅜ_ㅜ

 

 

 

 

은행에제

 

 

package aaa;

class Bank{
 private String name;
 private double money;
 private float iyul;
 
 public Bank(String name,double money,float iyul) {
  this.name = name;
  this.money = money;
  this.iyul = iyul;
 }
 public void setIyul(float iyul) {
  this.iyul = iyul;
 }
 public void disp() {
  System.out.println(name+"님의 잔액은"+money +"원이고,"+"현재 적용되는 이율은"+iyul*100+"%입니다.");
 }
}
public class Exam_0222222 {
 public static void main(String []  args) {
  Bank aaa= new Bank("aaa",1000,0.02f);
  System.out.println("=====================");
  aaa.disp();
  Bank bbb = new Bank("bbb",1000,0.01f);
  System.out.println("=====================");
  aaa.setIyul(0.01f);
  aaa.disp();
  bbb.disp();
  Bank ccc = new Bank("ccc",1000,0.03f);
  System.out.println("=====================");
  aaa.setIyul(0.03f);
  aaa.disp();
  bbb.setIyul(0.03f);
  bbb.disp();
  ccc.disp();
  
 }
}

 

--------------------

 

 

=====================
aaa님의 잔액은1000.0원이고,현재 적용되는 이율은2.0%입니다.
=====================
aaa님의 잔액은1000.0원이고,현재 적용되는 이율은1.0%입니다.
bbb님의 잔액은1000.0원이고,현재 적용되는 이율은1.0%입니다.
=====================
aaa님의 잔액은1000.0원이고,현재 적용되는 이율은3.0%입니다.
bbb님의 잔액은1000.0원이고,현재 적용되는 이율은3.0%입니다.
ccc님의 잔액은1000.0원이고,현재 적용되는 이율은3.0%입니다.

 

 

 

------------------------------------------

 

 

package aaa;

class Bank{
 private String name;
 private double money;
 private static float iyul;
 
 public Bank(String name,double money,float iyul) {
  this.name = name;
  this.money = money;
  this.iyul = iyul;
 }
 public void setIyul(float iyul) {
  this.iyul = iyul;
 }
 public void disp() {
  System.out.println(name+"님의 잔액은"+money +"원이고,"+"현재 적용되는 이율은"+iyul*100+"%입니다.");
 }
}
public class Exam_0222222 {
 public static void main(String []  args) {
  Bank aaa= new Bank("aaa",1000,0.02f);
  System.out.println("=====================");
  aaa.disp();
  Bank bbb = new Bank("bbb",1000,0.01f);
  System.out.println("=====================");
  aaa.setIyul(0.01f);
  aaa.disp();
  bbb.disp();
  Bank ccc = new Bank("ccc",1000,0.03f);
  System.out.println("=====================");
  //aaa.setIyul(0.03f);
  aaa.disp();
  //bbb.setIyul(0.03f);
  bbb.disp();
  ccc.disp();
  
 }
}

 

 

----------------

 

그래도 똑같은 값이 나온다. static에 저장되었기 때문에

 

 

---------------------

 

 

package aaa;

class Bank{
 private String name;
 private double money;
 private static float iyul;
 static {
  iyul = 0.02f;
 }
 
 public Bank(String name,double money,float iyul) {
  this.name = name;
  this.money = money;
  Bank.iyul = iyul;
 }
 public void setIyul(float iyul) {
  Bank.iyul = iyul;
 }
 public void disp() {
  System.out.println(name+"님의 잔액은"+money +"원이고,"
 +"현재 적용되는 이율은"+Bank.iyul*100+"%입니다.");
 }
}
public class Exam_0222222 {
 public static void main(String []  args) {
  Bank aaa= new Bank("aaa",1000,0.02f);
  System.out.println("=====================");
  aaa.disp();
  Bank bbb = new Bank("bbb",1000,0.01f);
  System.out.println("=====================");
  aaa.setIyul(0.01f);
  aaa.disp();
  bbb.disp();
  Bank ccc = new Bank("ccc",1000,0.03f);
  System.out.println("=====================");
  //aaa.setIyul(0.03f);
  aaa.disp();
  //bbb.setIyul(0.03f);
  bbb.disp();
  ccc.disp();
  
 }
}

-----------------------------

 

 

[2] final(마지막 값 x)

 

변수에 사용되면 상수

 

 

public class FinalTest1{

public static void main(String[] args){

final int MAX SPEED = 100;

MAX_SPEED = 150;

 

에러발생! final 변수는 값을 바꿀 수 없다

}

}

 

 

-------------------------------------------------------

 

메소드에 사용되면 메소드 변경 불가

 

class Test1{

public fianal void (String[] args){

System.out.println("바꿀 수 없지롱!!");

 

}

}

 

class Test2 extends Test1{

public void disp(){

System.out.println("에러가 발생하네!!");

 

 

---------------------------

 

 

클래스에 설정하면 상속 불가

 

final class Test1{

public void disp(){

System.out.println("이클래스는 상속 못받아!");

}

}

class Test2 extends Test1{

}

 

 

(3) static final

 

*static 기능과 final기능을 합쳐놓은 것

*객체(인스턴스)가 여러개가 되더라도 모든 객체가 값을 따로 가질 필요가 없고

그 값을 상수처럼 사용하고자 할 때 사용하는 키워드

 

 

 

자바의 상수 선언

public static final  멤버필드 ;

 

 

 

 

 

 

 

(4) transient

*직렬화 (serializing), 역직렬화(deserializing)를 하지 않겠다는 뜻

*자바 I/O를 배운 후 공부해 보자

 

 

 

 

 

 

(5) abstract

*추상화를 의미

*추상화메소드가 존재하면 그 클래스는 추상화클래스

*추상화클래스를 상속받으면 반드시 추상화메소드를 구현하여야 함

*추상화클래스는 객체를 생성할 수 없음

 

 

 

 

 

 

(6) synchronized (멀티스레드)

*동기화를 의미

*2개 이상의 스레드가 실행될 때 사용

*스타크래프트의 미네랄을 캐논 것을 생각하면 됨

 

 

 

 

 

 

 

static 프로그램 시작시 1번만 올라감

 

일반구분            //공통의 멤버필드의 초기값

 

A04( )

 

일반구분            //

 

A04(int a)