다이어그램 그리는데 좋은 사이트
책 소개
객체지향의 사실과 오해, 오브젝트... 조영호님
(두 권 다 있으나 객체지향의 사실과 오해 반밖에 못읽었다는...)
📌 가변 인자는 내부적으로 배열로 되어있다
📌 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 |