11시 10분 - 퀴즈
hrd에 업로드
1. 퀴즈(7문제) - 단답형
자바스크립트에서 나옴
1-1. 자바스크립트 해석엔진(개념)
1-2. 자료 - 변수,상수 선언법
1-3. 함수 - 선언, 사용
1-4. 배열 - 선언, 사용
2. 자기소개 - 캡처화면(1장)
접근제어자 class 클래스명 {
멤버필드
접근제어자 자료형 객체변수명;
메서드
접근제어자 리턴형(없으면void) 메서드명() {
}
* 인스턴스 / 클래스(static)
* 특별 메서드
main
생성자
* 오버로딩
* 가변인자
}
접근제어자
setter / getter
extends로 상속 구현 ex) A(자식) extends B(부모)
추상
다형
공통내용의 모듈화
단일 상속이 기본(편법)
extends라는 상속구문이 없다면 컴파일러가 무조건 Object 상속 받음
ex) class A {} <- Object클래스 상속받고있음.
// Object 클래스 상속받고있음(아무것도 상속받고있지 않는 클래스는 Object클래스를 상속받음)
class Parent {
void viewParent() {
System.out.println("viewParent 호출");
}
}
class Child extends Parent {
void viewChild() {
System.out.println("viewChild 호출");
}
}
public class InheritanceEx02 {
public static void main(String[] args) {
Child c = new Child();
c.viewChild();
c.viewParent();
System.out.println(c.toString());
Parent p = new Parent();
p.viewParent();
// Object에서 상속받은 toString();
System.out.println(p.toString());
}
}
다 같은 주소값이 나온다 (독립적 요소가 아님)
class Parent {
void viewParent() {
System.out.println("viewParent 호출 : " + this);
}
}
class Child extends Parent {
void viewChild() {
System.out.println("viewChild 호출 : " + this);
}
}
public class InheritanceEx03 {
public static void main(String[] args) {
Child c = new Child();
System.out.println(c);
c.viewChild();
c.viewParent();
}
}
class Parent {
void viewParent() {
System.out.println("viewParent 호출 : " + this);
}
}
class Child extends Parent {
void viewChild() {
System.out.println("viewChild 호출 : " + this);
}
}
class GrandChild extends Child {
void viewGrandChild() {
System.out.println("viewGrandChild 호출 : " + this);
}
}
public class InheritanceEx04 {
public static void main(String[] args) {
GrandChild gc = new GrandChild();
gc.viewGrandChild();
gc.viewChild();
gc.viewParent();
}
}
private은 개인적인것으로 간주하여 상속받아도 사용이 불가능하다.
class Parent {
private String p1 = "홍길동";
public String p2 = "박문수";
String p3 = "이몽룡";
void viewParent() {
System.out.println("viewParent 호출 : " + this);
}
}
class Child extends Parent {
void viewChild() {
System.out.println("viewChild 호출 : " + this);
System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
}
}
class GrandChild extends Child {
void viewGrandChild() {
System.out.println("viewGrandChild 호출 : " + this);
}
}
public class InheritanceEx04 {
public static void main(String[] args) {
GrandChild gc = new GrandChild();
gc.viewGrandChild();
gc.viewChild();
gc.viewParent();
}
}
class Parent {
private String p1 = "홍길동";
public String p2 = "박문수";
String p3 = "이몽룡";
void viewParent() {
System.out.println("viewParent 호출 : " + this);
}
}
class Child extends Parent {
void viewChild() {
System.out.println("viewChild 호출 : " + this);
// System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
}
}
class GrandChild extends Child {
void viewGrandChild() {
System.out.println("viewGrandChild 호출 : " + this);
}
}
public class InheritanceEx04 {
public static void main(String[] args) {
GrandChild gc = new GrandChild();
gc.viewGrandChild();
gc.viewChild();
gc.viewParent();
Child c = new Child();
System.out.println(c.p1);
System.out.println(c.p2);
System.out.println(c.p3);
}
}
조상 클래스에 정의된 기능을 자식 클래스에 적합하게 수정해서 재정의하는 것을 메서드 오버라이딩(overriding : 재정의) 라고 한다.
원래는 같은 이름의 메서드는 두 개 이상 쓸수없는것이 원칙 / 그렇지만 오버라이딩으로 원칙 뿌심
오버로딩과는 헷갈리면 안됨
class Parent {
void viewParent() {
System.out.println("viewParent 호출 : " + this);
}
}
class Child extends Parent {
void viewParent(int a) {
System.out.println("ChildviewParent 호출 : " + this);
}
}
class GrandChild extends Child {
void viewGrandChild() {
System.out.println("viewGrandChild 호출 : " + this);
}
}
public class OverridingEx01 {
public static void main(String[] args) {
Child c = new Child();
// 매개변수가 있기때문에 부모것으로 출력한다
c.viewParent();
// 자신의 메서드 출력
c.viewParent(10);
}
}
class Parent {
void viewParent() {
System.out.println("viewParent 호출 : " + this);
}
}
class Child extends Parent {
// 이름은 같지만 반환타입이 달라서 에러
int viewParent() {
System.out.println("ChildviewParent 호출 : " + this);
return 10;
}
}
class GrandChild extends Child {
void viewGrandChild() {
System.out.println("viewGrandChild 호출 : " + this);
}
}
public class OverridingEx01 {
public static void main(String[] args) {
Child c = new Child();
// 매개변수가 있기때문에 부모것으로 출력한다
c.viewParent();
// 자신의 메서드 출력
c.viewParent(10);
}
}
class Parent {
String p = "홍길동";
void viewParent() {
System.out.println("viewParent 호출 : " + this);
}
}
class Child extends Parent {
String p ="박문수";
void viewParent() {
System.out.println("ChildviewParent 호출 : " + this);
// super
super.viewParent();
System.out.println(p);
System.out.println(this.p);
System.out.println(super.p);
}
}
class GrandChild extends Child {
void viewGrandChild() {
System.out.println("viewGrandChild 호출 : " + this);
}
}
public class OverridingEx02 {
public static void main(String[] args) {
Child c =new Child();
c.viewParent();
}
}
class Parent {
Parent() {
System.out.println("Parent 생성자 호출");
}
}
class Child extends Parent {
Child() {
System.out.println("Child 생성자 호출");
}
}
public class ConstructorEx04 {
public static void main(String[] args) {
Child c = new Child();
}
}
부모가 기본 생성자가 아닌 매개변수가 있거나 하는 다른 생성자일 경우에는 super()로 찾아줘야한다.
this()와 같은 기능 대신 super()는 조상클래스에 사용
제일 첫 줄에 적어줘야한다.
class Parent {
// Parent() {
// System.out.println("Parent 생성자 호출");
// }
Parent(String data) {
System.out.println("Parent(String data) 생성자 호출");
}
}
class Child extends Parent {
Child() {
// Parent("10"); 이거로 부모 생성자 못가져옴
super("10");
System.out.println("Child 생성자 호출");
}
}
public class ConstructorEx04 {
public static void main(String[] args) {
Child c = new Child();
}
}
final이 붙은 클래스는 상속 불가능.
final 클래스 - 상속 불가
final 메서드 - 재정의(오버라이딩) 불가
final 변수 - 값 변경 불가
상수는 final static 형식으로 많이 쓰임
final class Parent {
Parent() {
System.out.println("Parent 생성자 호출");
}
}
// 부모가 final이기때문에 상속이 불가능하다. / 에러 발생.
class Child extends Parent {
Child() {
System.out.println("Child 생성자 호출");
}
}
public class Hello {
public static void main(String[] args) {
Child c = new Child();
}
}
class Parent {
Parent() {
System.out.println("Parent 생성자 호출");
}
// 다른 클래스에서 오버라이딩 못하게 한다.
final void viewParent() {
System.out.println("Parent viewParent 호출");
}
}
class Child extends Parent {
Child() {
System.out.println("Child 생성자 호출");
}
// 부모클래스의 viewParent()는 final 메서드여서 오버라이딩 못한다.
void viewParent() {
System.out.println("Child viewParent 호출");
}
}
public class Hello {
public static void main(String[] args) {
Child c = new Child();
c.viewParent();
}
}
다형성 - 클래스 형변환
부모 타입 변수로 여러 자식 객체들을 호출하고 싶을 때 사용
1. 상속 관계에서 형변환 가능
자식 -> 부모 = 자동형변환
부모 -> 자식 = 강제 형변환 / (자식)부모
class Parent {
void viewParent() {
System.out.println("Parent 호출");
}
}
class Child extends Parent {
void viewParent() {
System.out.println("Child 호출");
}
}
class Child2 extends Parent {
void viewParent() {
System.out.println("Child2 호출");
}
}
public class Hello {
public static void main(String[] args) {
// Child c = new Child();
// c.viewParent();
// Child2 c2 = new Child2();
// c2.viewParent();
Parent p = new Child();
p.viewParent();
p = new Child2();
p.viewParent();
}
}
클래스를 보관하기 위한 폴더.
Package이름 - 도메인 형식(회사 도메인)으로 작성.
Ex) package com.naver.www << 반대로 작성
같은 클래스 이름이라도 패키지가 다르면 사용 가능.
javac -d . -encoding utf-8 packB.java (폴더 만들어지고 안에 packb.class가 들어감)
{
패키지
클래스
...
}
{
모듈 (현업에서는 아직 잘 사용하지는 않음)
패키지
클래스
...
}
// 클래스를 이 패키지명을 통해 안에 넣는다.
package 패키지명
class 클래스명 {
}
패키지 안의 클래스를 가져오는 기능
패키지에 모든 클래스를 포함할 때는 '*' 사용
다른 패키지에 선언된 클래스들 사용 가능
// pack2를 선언하면 후 컴파일 해주면 pack의 packC.class 파일이 패키지 pack2 안에 생성이 된다.
package pack2;
// 같은 패키지의 다른 클래스에서 사용 할 수 있게 접근제어자 public으로 선언
public class packC {
public packC() {
System.out.println("packC 생성자 호출");
}
}
패키지명.클래스명 변수 = new 패키지면.클래스명(); // 이런 방식으로 호출