Java

6주차 과제: 상속 (feedback, 피드백)

2020. 12. 27. 12:03

다이어그램 그리는데 좋은 사이트

app.diagrams.net/

 

Flowchart Maker & Online Diagram Software

Flowchart Maker and Online Diagram Software diagrams.net (formerly draw.io) is free online diagram software. You can use it as a flowchart maker, network diagram software, to create UML online, as an ER diagram tool, to design database schema, to build BPM

app.diagrams.net

책 소개 

객체지향의 사실과 오해, 오브젝트... 조영호님

(두 권 다 있으나 객체지향의 사실과 오해 반밖에 못읽었다는...)

 

📌 가변 인자는 내부적으로 배열로 되어있다

 

📌 Object클래스에 붙여져 있는 @HotSpotIntrinsicCandidate 어노테이션의 의미?

컴파일러의 효율과 관련 있는 어노테이션

 

📌바이트코드 invokespecial 과 invokevirtual

invokespecial : 생성자 호출할 때, 슈퍼클래스의 생성자를 호출할 때  

invokevirtual : 서브 클래스에서 수퍼클래스의 메서드를 호출할 때, 같은 클래스 내의 다른 private 인스턴스 메서드를 호출할때 사용

자세한 사항은 아래 링크 읽어보자!

읽어보기

 

Q) 다이나믹 디스패치와 스태틱 디스패치가 왜 바이트 코드가 같을까요?

왜 둘 다 invokevirtual을 호출할까요?

=> 바이트코드만으로는 알 수 없다.  JVM내부의 virtual table에서 어떤 메소드를 호출할지 결정하는 것으로 예상됩니다.

 

비지터 패턴

Parser는 DomParser와 SAXParser(Simple API for XML)가 있다.

 

* DomParser (비지터 패턴과는 무관)

package choi.hyang.study.chapter6.visitor;

import org.springframework.core.io.ClassPathResource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;

// 비지터 패턴과 상관없다.
public class DomParser {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(new ClassPathResource("member.xml").getInputStream());
        NodeList members = document.getElementsByTagName("member");
        for (int i = 0; i < members.getLength(); i++) {
            Node node = members.item(i);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Element element = (Element) node;
                String id = element.getAttribute("id");
                System.out.println(id);
                NodeList child = element.getChildNodes();
                for (int j = 0; j < child.getLength(); j++) {
                    Node item = child.item(j);
                    if(item.getNodeType() == Node.ELEMENT_NODE) {
                        Element childNode = (Element) item;
                        String textContent = childNode.getTextContent();
                        System.out.println(childNode.getNodeName() + " " + textContent);
                    }
                }
            }
        } 
    }
}

* SAXParser

package choi.hyang.study.chapter6.visitor;

import org.springframework.core.io.ClassPathResource;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;

// 메모리를 O(1)만큼 사용
public class SaxParser {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();
        saxParser.parse(new ClassPathResource("member.xml").getInputStream(), new MemberHandelr());

    }

    // 비지터 패턴을 이용해서
    // 모든 element를 방문할때마다 출력
   static class MemberHandelr extends DefaultHandler {

        private String text;

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            this.text = new String(ch, start, length);
        }

        @Override
        public void startDocument() throws SAXException {
            System.out.println("start parsing xml");
        }

        @Override
        public void endDocument() throws SAXException {
            System.out.println("end parsing xml");
        }

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            System.out.println("element " + qName);
            if (qName.equals("member")) {
                System.out.println(attributes.getValue("id"));
            }
        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if(qName.equals("username")) {
                System.out.println("username " + text);
            }
            if(qName.equals("license")) {
                System.out.println("license" + text);
            }
        }
    }
}

 

Q) Object 클래스를 사용하는 이유

First-class citizen : 함수 자체를 매개변수로 넘기거나 함수자체를 리턴하거나 할 수 있어야 하는 언어이다.

자바도 지금은 함수로 그럴 수 있으나 그 이전에는 Object로 모든 것을 취급하려다 보니 최상위에 Object클래스를 두게 되었다.

 

다음 주 과제

1) package 키워드 : 어떻게 사용하는 건지, 어떤 제약 사항이 있는지

2) import 키워드 : static import도 설명

3) classpath : 개념 자체에 대한 설명, 자바 공부하는 사람들이 모르면 안 됨

4) classpath 환경 변수 

5) classpath 옵션

6) 접근 지시자

'Java' 카테고리의 다른 글

7주차 과제: 패키지 (피드백, feedback)  (0) 2021.01.02
7주차 과제: 패키지  (0) 2021.01.01
6주차 과제: 상속  (0) 2020.12.26
4주차 과제: 제어문(feedback, 피드백)  (0) 2020.12.22
5주차 과제: 클래스(피드백, feedback)  (0) 2020.12.20
'Java' 카테고리의 다른 글
  • 7주차 과제: 패키지 (피드백, feedback)
  • 7주차 과제: 패키지
  • 6주차 과제: 상속
  • 4주차 과제: 제어문(feedback, 피드백)
향찡
향찡
백엔드 개발자
향찡
Dev Story
향찡
전체
오늘
어제
  • 분류 전체보기 (97)
    • Java (42)
      • design pattern (7)
      • JavaCafe Study (4)
    • Kotlin (2)
    • Spring (4)
    • TypeScript (1)
    • DevOps (2)
      • AWS (1)
    • DB (4)
      • Real Mysql (2)
      • Redis (1)
    • OS (3)
      • Linux (3)
    • Algorithm (7)
    • Clean Code (1)
    • Git (5)
    • 환경 설정 (2)
    • 그냥 생각 (1)
    • 서평 (12)
      • 한빛미디어, 나는리뷰어다 2022 (4)
    • 세미나 (11)
    • 기타 (0)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 한빛미디어
  • 스터디할래
  • 코딩테스트
  • 제이펍
  • 깃 #깃허브
  • 코딩자격증
  • 스터디올래
  • 자바스크립트
  • 인프런
  • Real MySQL
  • 패스트캠퍼스후기
  • 유스콘
  • 백기선
  • 알고리즘
  • fastcampus
  • java
  • 패캠
  • 백준
  • Kotlin
  • java #study
  • 스터디
  • LeetCode
  • 자바카페
  • 파이썬
  • 코딩교육
  • git #github #doit #형상관리
  • OKKY
  • 자바스터디
  • 패스트캠퍼스
  • 자바

최근 댓글

최근 글

hELLO · Designed By 정상우.
향찡
6주차 과제: 상속 (feedback, 피드백)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.