- 기본자료형
- 참고(확장)자료형
- 객체(class)
- new
- .
- OOP
- 은닉
- 접근제어자
- public(일반적으로 메서드) / private(필드)
- setter / getter
- 상속
- 클래스의 재사용
- 추상
- 상속과 오버라이디잉 전제가 됨
- 추상클래스 , 추상 메서드
- 추상 필드라는 개념은 없음
- 인터페이스
- 필드 public static final
- 메서드 abstract
- extends 단일 상속
- implement 다중 구현
- 다형
- 인스턴스 멤버
- 스태틱(static) 멤버
- 멤버
- 필드
- 자동초기화 (↔지역변수는 자동초기화 되지 않음)
- 메서드
- 사용자 메서드
- is*** -true/false : 값 검사
- set/get*** : 값을 입력/출력
- 특수목적 메서드
- 생성자
- 멤버필드 초기화
- main
- 프로그램 시작/끝 지점
- 오버로딩
- 조건:
- 일반 메서드/ 생성자 둘다 가능함
- this
- this()
패키지 : 폴더단위로 관리
- 내용
- 일반클래스
- 추상클래스
- 인터페이스
- 명령어
- package : 파일로 관리하겠다는 명령어
- import : 클래스로 읽어드리는 명령어
- -d : 패키지 컴파일 옵션
class ParentEx01{
String p1;
void viewParent1(){
System.out.println("viewParent1() 호출"+this);
}
}
class ChildEx01 extends ParentEx01{
String c1;
void viewChild1(){
System.out.println("viewChild1() 호출"+this);
}
}
class ChildEx02 extends ParentEx01{
String c2;
void viewChild2(){
System.out.println("viewChild2() 호출");
}
}
public class MainEx2{
public static void main(String[] args){
ParentEx01 p1 = new ParentEx01();
p1.viewParent1();
ChildEx01 c1 = new ChildEx01();
c1.viewChild1();
c1.viewParent1();//부모로부터 클래스를 상속받아서 같은 주소에 넣는다
System.out.println(c1);
c1.p1="홍길동";
System.out.println(c1.p1);
ChildEx02 c2 = new ChildEx02();
c2.viewChild2();
c2.viewParent1();
c2.p1="박문수";
System.out.println(c2.p1);
}
}
2
class ParentEx01{
String p1;
ParentEx01(){
System.out.println("ParentEx01() 생성자 호출");
}
void viewParent1(){
System.out.println("viewParent1() 호출"+this);
}
}
class ChildEx01 extends ParentEx01{
String c1;
ChildEx01(){
System.out.println("ChildEx01() 생성자 호출");
}
void viewChild1(){
System.out.println("viewChild1() 호출"+this);
}
}
public class MainEx01{
public static void main(String[] args){
ChildEx01 c1 = new ChildEx01(); //부모의 생성자가 먼저 호출이 된다
System.out.println(c1);
}
}
3
class ParentEx02{
private String p1 = "홍길동"; //상속 제한
public String p2= "박문수";
String p3= "이몽룡";
}
class ChildEx02 extends ParentEx02{
}
public class MainEx02{
public static void main(String[] args){
ChildEx02 c1 = new ChildEx02();
//System.out.println(c1.p1);
//상속제한 에러발생 //MainEx02.java:12: error: p1 has private access in ParentEx02
System.out.println(c1.p2);
System.out.println(c1.p3);
}
}
4
class ParentEx02{
private void viewParent1(){ //상속제한
System.out.println("viewParent1() 호출");
}
public void viewParent2(){
System.out.println("viewParent2() 호출");
}
}
class ChildEx02 extends ParentEx02{
}
public class MainEx03{
public static void main(String[] args){
ChildEx02 c1 = new ChildEx02();
//상속제한 에러발생
//MainEx03.java:16: error: cannot find symbol c1.viewParent1();
//c1.viewParent1();
c1.viewParent2();
}
}
5
class ParentEx02{
public String s1="홍길동";
public void viewParent1(){
System.out.println("parent viewParent1() 호출");
}
}
class ChildEx02 extends ParentEx02{
public void viewParent1(){ //override 자식이 재정의 하면 자식것이 우선임
System.out.println("child viewParent1() 호출");
}
//super //부모클래스의 멤버필드, 맴버메서드
public void showParent1(){
super.viewParent1();
System.out.println(s1);
System.out.println(super.s1); //위보다 출처를 더 분명하게 나타냄
//System.out.println(super); //직접접근을 막아놓음 //참조에서만 쓸수 있음 super.xxx
System.out.println(this);
}
}
public class MainEx04{
public static void main(String[] args){
ChildEx02 c1 = new ChildEx02();
c1.viewParent1(); //자식이 정의한 viewParent1()를 보여줌
c1.showParent1(); //부모가 정의한 viewParent1()를 보여줌
}
}
6
class ParentEx01{
// ParentEx01(){
// System.out.println("ParentEx01 생성자");
// }
// 디폴트가 아니라 생성자에 인자를 넣어서 만들었다면 상속받을 때 인자값을 설정해주지 않으면 에러남
ParentEx01(String data1){
System.out.println("ParentEx01 생성자2");
}
}
class ChildEx01 extends ParentEx01{
ChildEx01(){
super("홍길동"); //생성자에 인자가 있도록 만들었으므로 인자를 넣어주어야 함 //생성자super() 첫줄
System.out.println("ChildEx01 생성자");
}
}
public class MainEx05{
public static void main(String[] args){
ChildEx01 c1 = new ChildEx01();
}
}
7
class UpperClass{
int x;
int y;
public UpperClass(){
x= 10;
y= 20;
}
public UpperClass(int x){
this(); //자신의 클래스UpperClass() 생성자 호출 // 생성자 호출은 첫줄에
this.x =x;
}
public UpperClass(int x, int y){
this(x); //자신의 클래스UpperClass(int x) 생성자 호출
this.y =y;
}
}
class LowerClass extends UpperClass{
int r;
public LowerClass(){
super(); //상위의 클래스UpperClass() 생성자 호출
r=30;
}
public LowerClass(int x){
super(x); //상위의 클래스UpperClass(int x) 생성자 호출
r=30;
}
public LowerClass(int x, int y){
super(x,y); //상위의 클래스UpperClass(int x, int y) 생성자 호출
r=30;
}
public LowerClass(int x, int y, int r){
this(x,y); //자신 클래스LowerClass(int x, int y) 생성자 호출
this.r=r;
}
}
public class MainEx06{
public static void main(String[] args){
LowerClass lc = new LowerClass(); //x=10, y=20, r=30
System.out.println("x ="+lc.x+", y ="+lc.y+", r ="+lc.r);
LowerClass lc1 = new LowerClass(50); //x=50, y=20, r=30
System.out.println("x ="+lc1.x+", y ="+lc1.y+", r ="+lc1.r);
LowerClass lc2 = new LowerClass(50,100); //x=50, y=100, r=30
System.out.println("x ="+lc2.x+", y ="+lc2.y+", r ="+lc2.r);
LowerClass lc3 = new LowerClass(50,100,150); //x=50, y=100, r=150
System.out.println("x ="+lc3.x+", y ="+lc3.y+", r ="+lc3.r);
}
}
8
class ParentEx01{
void viewParent(){
System.out.println("viewParent() 호출");
}
}
//추상클래스
abstract class ParentEx02{
void viewParent(){
System.out.println("추상클래스 viewParent() 호출");
}
}
class ChildEx02 extends ParentEx02{
}
//추상메서드
abstract class ParentEx03{ //추상메서드가 있는 클래스는 반드시 abstract 를 붙여주어야 함
abstract void viewParent(); //메서드 뒤에 내용{}을 구현하지 않음
}
abstract class ChildEx03 extends ParentEx03{
// void viewParent(){
// System.out.println("추상메서드 viewParent() 호출");
// }
}
class ChildSonEx03 extends ChildEx03{ //자식메서드가 부모의 추상메서드를 구현하지 못했을 때 손자 메서드에서 정의 가능
void viewParent(){ //대신 자식매서드는 구현하지 못했기때문에 abstract를 붙여야 한다
System.out.println("추상메서드 viewParent() 손자 상속 호출");
}
}
public class MainEx07{
public static void main(String[] args){
ParentEx01 p1 = new ParentEx01();
p1.viewParent();
// ParentEx02 p2 = new ParentEx02(); //error: ParentEx02 is abstract; cannot be instantiated ParentEx02
// p2.viewParent();
// ParentEx01 p3 = new ParentEx03();
// p3.viewParent();
ChildEx02 c1 = new ChildEx02();
c1.viewParent();
// ChildEx03 c2 = new ChildEx03();
// c2.viewParent();
ChildSonEx03 c3 = new ChildSonEx03();
c3.viewParent();
}
}
9
//인터페이스 //최고로 추상화된 클래스
interface interA{
public static final String str1="홍길동";
//String str1="홍길동"; //인터페이스 에서 생략가능
public abstract void methodA();
//void methodA(); //인터페이스 에서 생략가능
interface interB{
public static final String str2="박문수";
public abstract void methodB();
}
class ClassA implements interA, interB{ //다중상속
public void methodA(){
System.out.println("methodA 호출");
}
// void methodA(){ //컴파일 에러 public 붙여주어야 함
// System.out.println("methodA 호출");
// }
public void methodB(){
System.out.println("methodB 호출");
}
}
public class MainEx08{
public static void main(String[] args){
ClassA a = new ClassA();
a.methodA();
a.methodB();
}
}
10
//인터페이스
interface interA{
public static final String str1="홍길동";
public abstract void methodA();
}
interface interB extends interA{ //인터페이스 간에 상속 가능함
public static final String str2="홍길동";
public abstract void methodB();
}
class ClassA implements interB{ //상속된 인터페이스B를 구현함으로 A,B를 둘다 구현함
public void methodA(){
System.out.println("methodA 호출");
}
public void methodB(){
System.out.println("methodB 호출");
}
}
public class MainEx09{
public static void main(String[] args){
ClassA a = new ClassA();
a.methodA();
a.methodB();
}
}
11
package com;
class StudentB {
private String name;
public StudentB(){
this.name = name;
}
}
12
import com.StudentB; //패키지를 불러오려면 public 이어야 한다
public class MainEx01{
public static void main(String[] args){
StudentB s = new StudentB();
s.name = "홍길동";
System.out.println(s.name);
}
}
13
package com;
public class StudentB {
public String name;
public StudentB(){
this.name = name;
}
}
package com;
//import com.StudentB; //여러번 사용시
public class MainEx01{
public static void main(String[] args){
//StudentB s = new StudentB();
com.StudentB s = new com.StudentB(); //한번 사용시
s.name = "홍길동";
System.out.println(s.name);
}
}
14
package util;
public class MainEx01{
public MainEx01(){ }
public void disp(){
System.out.println("Package로 만든 클래스");
}
}
//import util.*; //TestEx01 클래스가 MainEx01과 같은 패키지에 있을경우에만 import됨
import util.MainEx01;
public class TestEx01{
public static void main(String[] ar){
MainEx01 ts = new MainEx01();
util.MainEx01 ts1 = new util.MainEx01(); //절대 경로
ts.disp();
ts1.disp();
}
}
댓글 없음:
댓글 쓰기