Shallow Copy(얕은 복사)

 

1) 소스와 타겟이 모두 추가/변경에 영향을 받음

ArrayList<Node> sourceList = new ArrayList<>();

ArrayList<Node> targetList = sourceList;

 

아래 2),3),4)는 추가는 소스만, 변경은 소스와 타켓 모두 영향을 받음

2)

ArrayList<Node> sourceList = new ArrayList<>();

ArrayList<Node> targetList = new ArrayList<>(sourceList);

 

3)

ArrayList<Node> targetList = new ArrayList<>();

targetList.addAll(sourceList);

 

4)

ArrayList<Node> sourceList = new ArrayList<>();

ArrayList<Node> targetList = (ArrayList<Node>)sourceList.clone();

 

2.Deep Copy(깊은 복사)

 

5)소스와 타겟의 데이터 추가 및 변경이 독립적

 

 

ArrayList<Node> sourceList = new ArrayList<>();

ArrayList <Node> targetList = new ArrayList<>();

for (Node node : sourceList) {
    Node newNode = new Node(node.data, node.name);
    targetList.add(newNode);
}

 

import java.util.ArrayList;

class Node {

    int data;
    String name;

    Node(int data, String name) {

        this.data = data;
        this.name = name;
    }

    public String toString() {

        return "{" + Integer.toString(data) + ", " + name + "}";
    }
}

public class ArrayListTest {
    public static void main(String[] args) {

        testCopy1();
        System.out.println("===============\n\n");
        testCopy2();
        System.out.println("===============\n\n");
        testCopy3();
        System.out.println("===============\n\n");
        testCopy4();
        System.out.println("===============\n\n");
        testCopy5();

    }

    static void testCopy1(){
        ArrayList<Node> sourceList = new ArrayList <Node>();

        Node node[] = new Node[5];
        for(int i = 0; i < 5; i++) {
            node[i] = new Node(i, Integer.toString(i));
        }

        sourceList.add(node[0]);
        sourceList.add(node[1]);
        sourceList.add(node[2]);

        System.out.println("Before1: ");
        System.out.println("sourceList = " + sourceList.toString());

        ArrayList <Node> targetList = sourceList;

        System.out.println("targetList = " + targetList.toString());

        sourceList.add(node[3]);//source, target 추가됨

        node[2].data = 10;
        node[2].name = "10";//source, target 변경됨

        System.out.println("\nAfter: ");
        System.out.println("sourceList = " + sourceList.toString());
        System.out.println("targetList = " + targetList.toString());
    }

    static void testCopy2(){
        ArrayList<Node> sourceList = new ArrayList <>();

        Node node[] = new Node[5];
        for(int i = 0; i < 5; i++) {
            node[i] = new Node(i, Integer.toString(i));
        }

        sourceList.add(node[0]);
        sourceList.add(node[1]);
        sourceList.add(node[2]);

        System.out.println("Before2: ");
        System.out.println("sourceList = " + sourceList.toString());

        ArrayList <Node> targetList = new ArrayList <> (sourceList);

        System.out.println("targetList = " + targetList.toString());

        sourceList.add(node[3]);//source만 추가됨

        node[2].data = 20;
        node[2].name = "20";//source, target변경됨

        System.out.println("\nCurrent2: ");
        System.out.println("sourceList = " + sourceList.toString());
        System.out.println("targetList = " + targetList.toString());
    }

    static void testCopy3(){
        ArrayList<Node> sourceList = new ArrayList <>();

        Node node[] = new Node[5];
        for(int i = 0; i < 5; i++) {
            node[i] = new Node(i, Integer.toString(i));
        }

        sourceList.add(node[0]);
        sourceList.add(node[1]);
        sourceList.add(node[2]);

        System.out.println("Before3: ");
        System.out.println("sourceList = " + sourceList.toString());

        ArrayList <Node> targetList = new ArrayList <> ();
        targetList.addAll(sourceList);

        System.out.println("targetList = " + targetList.toString());

        sourceList.add(node[3]);

        node[2].data = 30;
        node[2].name = "30";

        System.out.println("\nAfter3: ");
        System.out.println("sourceList = " + sourceList.toString());
        System.out.println("targetList = " + targetList.toString());
    }

     static void testCopy4(){
        ArrayList<Node> soureList = new ArrayList <Node>();

        Node node[] = new Node[5];
        for(int i = 0; i < 5; i++) {
            node[i] = new Node(i, Integer.toString(i));
        }

        soureList.add(node[0]);
        soureList.add(node[1]);
        soureList.add(node[2]);

        System.out.println("Before4: ");
        System.out.println("sourceList = " + soureList.toString());

        ArrayList <Node> targetList = (ArrayList <Node>)soureList.clone();

        System.out.println("targetList = " + targetList.toString());

        soureList.add(node[3]);

        node[2].data = 40;
        node[2].name = "40";

        System.out.println("\nAfter4: ");
        System.out.println("sourceList = " + soureList.toString());
        System.out.println("targetList = " + targetList.toString());
    }

    static void testCopy5(){
        ArrayList<Node> sourceList = new ArrayList <>();

        Node n[] = new Node[5];
        for(int i = 0; i < 5; i++) {
            n[i] = new Node(i, Integer.toString(i));
        }

        sourceList.add(n[0]);
        sourceList.add(n[1]);
        sourceList.add(n[2]);

        System.out.println("Before5: ");
        System.out.println("sourceList = " + sourceList.toString());

        ArrayList <Node> targetList = new ArrayList<>();

        for (Node node : sourceList) {
            Node newNode = new Node(node.data, node.name);
            targetList.add(newNode);
        }

        System.out.println("targetList = " + targetList.toString());

        sourceList.add(n[3]);//sourceList 만추가

        n[2].data = 50;
        n[2].name = "50";//sourceList만 변경

        System.out.println("\nAfter5: ");
        System.out.println("sourceList = " + sourceList.toString());
        System.out.println("targetList = " + targetList.toString());
    }
}

'개발' 카테고리의 다른 글

Doxygen (문서화 툴)  (0) 2009.07.20
Posted by Lumasca
,

OnTouchListener를 사용하는데 warning이 나온다. 경고표시된 코드 블록이 보기도 안좋다.

 

찾아보니 방법은 2가지 정도 있는 것 같다.

 

첫번째는 @SuppressLint("ClickableViewAccessibility") 를 메소드 위에 선언한다.

 

두번째는 리스너 내부에 v.performClick() 을 호출하면 된다.

@SuppressLint("ClickableViewAccessibility")//방법1
private var myOnTouchListener = OnTouchListener {v, event ->


	when (event?.action) {
        MotionEvent.ACTION_UP -> {
			v.performClick() //방법2
		}
    }
}

 

 

Posted by Lumasca
,

기술사를 학습을 처음하는 분들은 아마 어떻게 공부를 할지 막막할 것이다.

학원에서도 구체적으로 알려주지는 않는다. 기술사 합격자들의 후기를 통해서 어느정도 파악은 가능하다.

합격으로 가는길은 다양하다. 자기에게 맞는 스타일이 있다. 여러 후기를 참고하고 자신만의 스타일을 찾도록 하자.

 

목표는 다음 필기시험에 합격이다. 그리고 목표를 달성하기 위한 전략과 계획을 수립해야 한다. 계획이 없는데 어떻게 목표를 달성할 수 있겠는가..공부기간은 당연히 지금부터 필기시험일까지이다. 1년, 2년씩 장기계획을 세우는게 아니다.

 본인도 별다른 계획이 없었다. 그저 열심히만 하면 합격이 될줄 알았다. 멘토님을 만나고 합격을 위해서는 구체적인 계획이 필요함을 알게되었다.

 

 SWOT 분석을 통해 본인의 강점과 약점, 기회 및 위협요인을 식별해야 한다. 약점은 개선하고 위협은 제거하도록 노력한다.

각 과목별 학습기간을 주단위로 정한다. 양이 많은 과목은 2-3주까지 될거고 양이 적은 과목은 1주..

주가 정해졌으면 학습할 토픽을 정한다. 토픽목록은 공개되어있을 것이다. 기출문제를 분석해서 토픽을 추가한다. 두번 다시 나오지 않을 이상한 문제들은 제외한다.

모든 토픽을 다 학습할 수는 없다. 선택과 집중이 중요한다. 시간도 별로 없다. 핵심토픽은 재사용성이 높은 토픽이다. 답안을 작성할때 활용하기 좋은 것을 의미한다. 핵심토픽 위주로 기둥을 세우고 가지를 뻗어나간다.

이제 과목별로 일주일간 시간대별로 무슨 공부를 얼만큼 작성할지 목록을 작성한다. 그리고 매일 공부가 끝나고 자기전에 실제로 학습한 시간을 작성한다.

 


다음은 나의 학습 루틴이었다. 

 

1)주중: 자투리 시간을 잘 활용하자. 양치할때, 화장실갈때 

 

-아침: 7시에 일어난다.

 

-출근길: 도보이동(녹음한 토픽 듣기), 지하철(서브노트)

 

-업무시간:  녹음한 토픽듣기, 토픽 자료조사 (이건 여건이 되면 하는거고 아니면 만다. 업무에 지장을 주면 안된다)

 

-점심시간: 1교시 토픽2 안보고 쓰기(구글Doc을 활용했었는데. 포털이 막힌 회사도 있다. 본인의 블로그 작성하면 될듯하다), 나머지 시간은 암기노트

 

-퇴근길: 도보이동(녹음한 토픽 듣기), 학습할 토픽 2 암기(서브노트)

 

-저녁: 독서실에 간다.

토픽2 쓰기. 다음순으로 진행한다. 1)필사, 2)암기, 3)외어쓰기 4)검토: 답안지에 작성시간 기록하고 빈칸 또는 틀린 부분 빨간펜으로 교정 보통 이렇게 하면 2개에 한시간정도 걸린다. 

그후에는 마음대로 학습한다. 학습한 토픽의 암기노트 작성하거나 서브노트를 반복한다. 내일 학습할 토픽 2 정리한다.(토픽정리에 너무 시간을 소모하지 않는다. 서브노트의 완성은 없다. 점진적으로 개선하는 것아다.)

 

-잠: 2시정도에 잤다. 나는 보통 잠을 6시간 정도 자는데 공부기간에는 한시간 정도 줄였다. 5시간정도는 확보해야 회사에서 졸지 않았다.

하지만 최근 합격할때는 수면의 질을 생각해서 6시간 정도 잠을 잤다.

 

2)주말

토요일은 학원에 간다. 독학기간에는 독서실로 갔다.

보통 오전 모의고사(1교시 10문제,2교시 2문제)를 보고 오후에는 낮은 점수 답안 다시 쓰고, 토픽토론을 하면서 보낸다.

6시나 7시쯤 끝나면 독서실에 간다. 독서실에서는 학원에서 내준 과제를 수행한 후에 서브노트를 반복한다.

 

일요일은 독서실에 간다.

일주일 토픽을 가지고 자체 1교시 100분시험을 보도록 한다. 공부가 처음이신분은 주중에 학습한 토픽이 대상이다.

나는 1교시 문제는 다음 순서로 선택해서 작성했다.

1) 경험한 문제, 2)자신있는 문제, 3)암기잘한 문제, 4)모르는 문제, 5)누구나 다 아는 문제

 

1교시는 몇개의 답안 프레임워크를 가지고 있어야 한다. 아래와 같이 문제 유형별로 답안에 작성할 지식(토픽별로 정의, 특징 등 지식영역 10~20개 정도를 서브노트에 작성)을 어떻게 배치할 것인지 본인만의 것을 작성해야한다. 몇년전에 작성한 것이라 요즘 답안 프레임워크와는 차이가 있다. 단지 참고용이다.

공부를 어느정도 하신분이면 가지고 있는 토픽도 많을텐데 평일 저녁에 100분시험을 봐도 된다. 그후에는 서브노트를 반복한다. 

 6시쯤 집으로 갔다. 가족과 밥한기는 먹어야하고 다음주 공부를 위해 일요일은 휴식한다.

 

이러면 보통 주중에는 하루에 4-5시간씩 20-25시간, 주말에 20시간 정도 공부시간일 될 것이다. 

공부시간은 양보다는 질이 중요하다. 얼마나 본인이 집중해서 공부했는지를 확인해야 한다.

 


추가사항

*나는 처음에 서브노트를 바인더에 수기로 작성한 1교시 답안을 철하는 방식으로 했다. 지식이 추가되면 인쇄해서 오려붙이는 방식으로 했다. 이것을 사진을 찍어서 폰으로 보고 다녔다.

그러다가 가지고 있는 자료를 원노트로 복사하고 활용했다.

 

*토픽별로 1교시 답안은 키워드와 설명을 녹음해서 들었다. 

 

*마인드맵 그리기 예제(IT경영) : 예전 멘토님 강의할때 작성한 건데 몇년된거라 많이 낡았다. 다른 과목도 작성하고 벽에 붙여두고 시간날때마다 보았다.

 

*월별 학원 모의고사는 꼭 보길 바란다.

본인의 현재 수준을 알아야 한다. 목표점수는 60, 나는 몇점?? 이 점수로 전략과 계획을 수정을 해야한다.

나는 독학할때는 모의고사도 안봤다. 하지만 후회한다. 내 수준을 알 방법은 실전뿐이기에..

학원다니면서 모의고사를 보면서 좋은 성적을 받은적이 없다. 심지어 답안을 다 못쓴 경우도 꽤 있었다.

하지만 실전에서는 못쓰면 죽는다는 각오로 임했다. 14페이지까지 작성한 적도 있다.

합격할때는 모든 교시의 답안이 12페이지 정도였다. 1교시는 좀더 많았으려나..

적게 쓰고 합격하는게 잘하는거다. 단락을 더쓰면 점수를 더 주겠지만..

모의고사는 무작정 쓰는게 아니라 자신의 답안스타일이 점수를 얼마나 받는지 확인하는 용도로 활용하는 것이다.

모의고사에서 못했다고 좌절하거나 그럴필요없다. 실전에서 잘하면 된다.

실전답안은 절실하고 간절한 마음을 담아서 작성해라. 모르는 문제라도 연관된 지식을 잘 녹여라.

2교시형에서 남들 다 아는거 1문제, 모르는 문제가 3개였는데도 63점을 맞았었다.

 

*필기 시험전에는 휴가 사용을 권장한다.

2-3일 정도 길면 5일...이 휴가는 공부 목적이 아니라 컨디션 조절을 위한 것이다. 특히 회사일을 잊어버리기 위함이다.

나는 암기노트를 보거나 영어 스펠링을 점검한다던가 하는 식으로 보냈다.

 

기술사 독학을 하는 과정에서 추운 겨울날 고시원에서 한달간 생활한 적이 있었다.

시험 일주일을 앞두고 감기 초기 증상이 왔다. 휴가를 5일 내고 집에서 휴식을 하면서 컨디션 회복에 전념했다.

그리고 시험을 봤다. 점수가 낮았냐고? 아니다. 그때까지 가장높은 점수 57점이었다.

 

여러분은 이미 최소 수개월이상 열심히 공부했다. 그거면 충분히 준비를 한 것이다. 

공부가 완성되어서 합격하는게 아니라 하다보니 어느순간 된다는 말을 실감하게 될 것이다.

포기하지 말고 장기간 쉬지도 말고 합격할때까지 하는 것이다. 

 

 

Posted by Lumasca
,

나의 경우는 Run 메뉴에서 선택을 잘못해서 발생한 문제였다.

 

그냥 테스트 파일을 새로 만들고 테스트 코드를 복사해 넣자.

그리고 Run에서 tests in xxx.dart  를 선택해야 한다. 

 

 

xxx.dart 를 선택하면 Dart Command Line App 으로 실행으로 된다.

Configurations에 가서 보면 이렇게 구성되어 있다. test로 변경할 수가 없다.

 

Posted by Lumasca
,

맥(Mac) 화면 캡쳐

IT Others 2020. 12. 29. 09:20

1. 전체화면 캡쳐

Command + Shift + 3

 

2.부분화면 캡쳐

Command + Shift + 4 를 누르면 마우스 포인터가 + 모양으로 변한다.

마우스를 드래그해서 캡쳐할 영역을 선택하면 된다.

 

3.특정 다이얼로그 캡쳐

캡쳐할 다이얼로그를 선택하고 Command + Shift + 4 + Space bar 를 누르면 마우스 포인터가 카메라 모양으로 변한다.

마우스를 클릭하면 된다.

Posted by Lumasca
,

갤노트9을 사용중인데 언제부터인가 Samsung Push Service 라는 이름으로 광고가 푸쉬로 오기 시작했다.

 

설정 앱을 실행하고 목록에서 "계정 및 백업"을 찾는다.  돋보기 아이콘 누르고 "계정"으로 검색해도 된다.

 

계정 및 백업 화면에 진입했으면 "계정"을 선택한다.

 

계정화면에서는 여러 계정이 있을건데 삼성계정 이메일을 선택해야한다.

 

삼성계정화면에서는 "개인정보보호" 항목을 선택한다.

 

개인정보보호 화면에서는 "맞춤 서비스"를 선택한다.

 

맞춤 서비스 화면에서 제일 마지막으로 이동하면 "맞춤형 광고 및 직접 마케팅" 항목이 있다.

 

끄기로 변경하자.

 

나는 맞춤형도 필요없으니 아예 맞춤 서비스 자체를 꺼버렸다.

Posted by Lumasca
,

1.합격점수

2과목(SQL 활용)은 문제가 어려웠다고 느꼈는데 주관식 2문제 정답처리가 아니었으면 매우 위험했다.

투입시간대비해서 합격점수가 나와줘서 참 다행이었다.

실전시험에서 기출문제가 그대로 나오는 것도 꽤 있었다. 시간을 절약하는데 도움이 됐다.

 

2.준비기간

본인은 IT분야에서 개발자(모바일)로 일하고 있으며, DB에 대한 지식을 보유한 상태이다. 데이터 모델링 SQL(기본, 조인방식) 등

공부 기간은 ADsP 시험이 끝나고 나서부터 준비했으니 약 일주일정도 된다. 시간으로는 15~20시간 정도.

비전공자라면 한달정도는 투자해야하지 않을까 생각한다. 데이터 모델링 과목의 개념/논리/물리 모델링, 이과정에 포함된 정규화/반정규화는 이해하는데 시간이 필요하다. SQL 역시 문법을 익혀야하고 실습까지 해야 익숙해진다.

 

3.공부방법

교재는 아래 실전문제집 하나만 했다. 

이론은 내가 가지고 있는 자료와 인터넷 요약집으로 충분했고, SQL 활용에대한 문제를 익히는데 중점을 두었다.

문제를 풀때마따 맞은 문제(이해하고 푼 문제)는 제외하고 틀린문제(잘 모르는 문제포함)만 다시 풀었다. 1회때에는 풀이집도 잘 읽어가면서 나만의 암기노트로 정리를 했다. 대략 5-6회정도 풀어본것 같다. 참고로 이책의 문제수가 좀 많다.

데이터 모델링과 SQL기본은 쉽게 넘어갔다. 문제 몇번 풀어보니 이미 아는 것도 많고, 한번 풀어본 문제는 금방 이해가 된다.

문제는 SQL 활용이었다. 서브쿼리, 계층형 질의 같은건 듣지도 보지도 못한 쿼리였다. 공부하는데 시간이 많이 걸렸다. 

선택과 집중도 중요하다. 공부할 시간은 별로 없으니 출제안될 것 같거나 이해가 안되는 문제는 버렸다. 어차피 기본이 중요하다.

 

SQL은 실습을 하는게 좋다. 실습환경은 Docker 에 MySQL을 설치하고 MySQLWorkbench 프로그램을 이용해서 쿼리 연습을 했다.

문제집이라 스키마 파일이 없어서 복잡한 쿼리는 실습이 불가했다. 

다른 수험서적은 스키마 파일이 제공되는지 모르겠다.

 

 

이 시험 역시 응시료가 5만원으로 비싸다. ADsP와 마찬가지로 시험을 두번 보고 싶은 생각은 전혀 없었다. 

모든 시험이 그렇듯이 합격에 대한 간절함으로 집중해서 공부를 해야 좋은 결과로 이어진다.

기본에 충실, 간절함 ,선택과 집중이 필요하다. 대부분 시험이 그렇듯 60점만 맞으면 합격이다.

효율적으로 공부해야 한다.

 

'IT 자격증 > SQLP,SQLD' 카테고리의 다른 글

SQLD 2020년 시험일정  (0) 2020.07.13
Posted by Lumasca
,

합격은 예상했지만, 점수가 얼마나 나올지 궁금했는데 그럭저럭 나와주었다.

공부할때도 데이터 분석이 좀 어려웠는데 점수가 제일 낮다.

 

공부는 인터넷(검색, 네이버 카페 등)에서 흔히 구할 수 있는 자료를 이용했다.

그리고 문제집은 아래책(데이터분석 자격검정 실전문제)을 구입했다. 인터넷에 기출문제가 있지만 해석은 없기때문에 이 책도 나름 도움이 되었다. 요약자료와 기출문제를 내 나름대로 정리해서 암기노트처럼 만들어서 반복해서 보았다.

특히 회귀분석 같은 데이터 분석 결과에 대한 내용을 이해하는데 시간이 많이 걸렸다. 인터넷에 지식을 잘 정리해서 공유해준 분들한테 참 고마움을 느낀다. 책없이 인터넷 자료로만 공부해도 충분하다.

 

 본인은 IT 경력자이며 빅데이터에 대해서 어느정도의 지식은 있었지만 통계나 데이터 분석은 알지 못한 상태(비전공)에서 공부를 시작했다.

약 한달간 매일 2시간 정도를 투자했다. 주말이라고 더 공부를 하진 않았다. 전체 소요시간은 30~40시간 정도라고 할 수 있겠다. 자료 정리하는데 시간이 좀더 걸린다. 비전공자는 용어에 대한 개념을 이해하는데 시간이 좀 소요될 것으로 보인다. 

 

참고로 시험 비용이 5만원으로 비싸다. 개인적으로 시험을 두 번이상 볼만큼 투자할 가치가 있는 자격증은 아니라고 생각한다.

그래서 안떨어지려고 공부를 열심히 했다. 시험자체는 그리 어려운편은 아니었다. 기출문제도 동일하게 나와주고..

 

'IT 자격증 > ADP,ADsP' 카테고리의 다른 글

ADsP 시험 26회 후기  (1) 2020.08.29
ADP, ADsP 2020년 시험일정  (0) 2020.06.15
Posted by Lumasca
,